C# 泛型如何强制转换返回类型
本文关键字:转换 返回类型 何强制 泛型 | 更新日期: 2023-09-27 18:32:32
我有字典
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。有什么想法吗?谢谢。
问题出在以下行上:
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;
}
T 只是一个类型。你不会把它投射到任何东西上。如果你有一个 T 的实例,你将有 (Person)T。
您还可以执行以下操作:其中 T:假设你的问题的人只是相反的措辞。
如果你有这样的字典:
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;
}
假设您保证字典具有您需要的值。 我认为没有必要在这里涉及泛型。
要么:
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;
}
可以使用反射来填充属性:
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);