C#将List <object>转换为原始类型,没有显式转换</object>

时间:2012-08-14 14:46:54

标签: c# dynamic generic-list

我无法在没有显式强制转换的情况下将列表对象转换回原始类型。我的目的是概括方法,以便我可以传递不同的数据库类型,如人或公司。我通过反射获取值没有问题但我需要将实际列表转换回原始类型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)
{
}

3 个答案:

答案 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)