我无法在没有显式强制转换的情况下将列表对象转换回原始类型。我的目的是概括方法,以便我可以传递不同的数据库类型,如人或公司。我通过反射获取值没有问题但我需要将实际列表转换回原始类型List<typeT>
而不是{I}传递给它的方法中的List<object>
。我知道以下方法:
SomeList.ConvertAll(x => (typeT)x);
SomeList.Cast<typeT>().ToList();
但是对于这些方法,我必须显式地转换typeT。我尝试过以下方法:
formatted1.ConvertAll(x => Convert.ChangeType(x, typeT));
和
List<dynamic> newList = new List<dynamic>();
foreach (var p in SomeList)
{
newList.Add(Convert.ChangeType(p, typeT);
}
到目前为止没有成功。也许我应该有另一个游戏计划来完全概括这些方法。现在我按照以下方式传递列表:
public string returnJson(List<object> entity, string someString)
{
}
答案 0 :(得分:6)
似乎使returnJson
泛型会解决大多数这些问题:
public string returnJson<T>(List<T> entity, string someString)
{
}
现在returnJson
可以一般使用,例如:
returnJson<Company>(listOfCompanies, "someString");
和
returnJson<Person>(listOfPersons, "someOtherString");
您仍然可以反映对象,但列表始终是编译时所需类型的列表。无需铸造。
答案 1 :(得分:1)
为什么不使用泛型,这样调用函数可以做它所需要的:
public string returnJson<T>(List<T> entity, string someString)
{
//not sure what someString is for or why you need the type for this naming scheme
JavaScriptSerializer jss = new JavaScriptSerializer();
return jss.Serialize(entity);
}
答案 2 :(得分:0)
您可以使用动态关键字和反射来创建列表。
dynamic newList = Activator.CreateInstance(typeof(List<>).MakeGenericType(typeT));
foreach (var p in SomeList)
{
newList.Add(p);
}
CallOtherMethodOverloadedForListOfPersonCompanyEtc(newList)