0

私は辞書を持っています

var dictionary = new Dictionary<string,string>{{"name","Smith"},{"age","20"}};

そして、その値をクラスにマップしたい

class Person{ 
public string Name {get;set;} 
public string Age {get;set;}
}

私はこのようにそれをやろうとしました

public T Map<T>(Dictionary<string, object> row) 
{
      var p= new Person();
      if (row.ContainsKey("name")) Person.Name= row["name"];
      if (row.ContainsKey("age")) Person.Age= row["age"];
      return (T) p;
}

問題は、リターンタイプで失敗することです。TをクラスPersonにキャストする方法がわかりません。何か案は ?ありがとう。

4

5 に答える 5

4

問題は次の行にあります。

var p= new Person();

Personタイプを返そうとしていTますが、何でもかまいません。

クラスにジェネリック型の制約を追加する必要がありますTPersonただし、それはあまり役に立ちません。

しかし、あなたの場合、ジェネリックは必要ありません:

public Person Map(Dictionary<string, string> row) 
{
      var p= new Person();
      if (row.ContainsKey("name")) Person.Name= row["name"];
      if (row.ContainsKey("age")) Person.Age= row["age"];
      return p;
}
于 2012-04-27T15:40:52.190 に答える
2

T はただの型です。あなたはそれを何にもキャストしません。T のインスタンスがあれば、(Person)T になります。

次のこともできます: どこで T: あなたの質問が逆に書かれていると仮定する人。

于 2012-04-27T15:41:16.340 に答える
2

次の形式の辞書がある場合:

new Dictionary<string,string>{{"Smith", "20"},{"Paul","44"}}

これは、LINQ を使用して簡単に行うことができます。何かのようなもの:

dictionary
    .Select(k=>new Person()
        {
            Name=k.Key,
            Age=k.Value
        })
    .ToList();

あなたが持っている辞書では、次のようなことをしなければなりません:

public Person GetPersonFromDictionary(Dictionary<string,string> dictionary)
{
    var myPerson = new Person()
    {
        Name=dictionary[name],
        Age=dictionary[age]
    }
    return myPerson;
}

ディクショナリに必要な値があることが保証されていると仮定します。ここにジェネリックを含める必要はないと思います。

于 2012-04-27T15:41:40.777 に答える
1

リフレクションを使用して、プロパティにデータを入力できます。

 public static T Map<T>(Dictionary<string, string> dictionary) where T : class, new()
    {
        var obj = new T();
        var properties = typeof(T).GetProperties();

        foreach (var item in dictionary)
        {
            var prop = properties.FirstOrDefault(p => p.Name.Equals(item.Key, StringComparison.InvariantCultureIgnoreCase));
            if (prop != null)
                prop.SetValue(obj, item.Value, null);
        }

        return obj;
    }

..。

 var dictionary = new Dictionary<string, string> { { "name", "Smith" }, { "age", "20" } };
 Person o = Map<Person>(dictionary);
于 2012-04-27T15:54:30.417 に答える
1

また:

public Person Map(Dictionary<string, object> row) 
{
      var p= new Person();
      if (row.ContainsKey("name")) Person.Name= row["name"];
      if (row.ContainsKey("age")) Person.Age= row["age"];
      return p;
}

または:

public T Map<T>(Dictionary<string, object> row) 
 where T : Person
{
      var p= new Person();
      if (row.ContainsKey("name")) Person.Name= row["name"];
      if (row.ContainsKey("age")) Person.Age= row["age"];
      return (T) p;
}

または:

public T Map<T>(Dictionary<string, object> row) 
 where T : Person, new ()
{
      var p= new T();
      if (row.ContainsKey("name")) Person.Name= row["name"];
      if (row.ContainsKey("age")) Person.Age= row["age"];
      return p;
}
于 2012-04-27T15:44:25.580 に答える