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可以是任何类型。

您需要向该类添加一个泛型类型约束,只允许T成为Person- 尽管这不是很有用。

但是在您的情况下,甚至不需要泛型:

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。

你也可以这样做: where T: Person 假设你的问题只是相反的措辞。

于 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 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 回答
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 回答