将Type动态传递给

看,我有这样的情况……

object myRoledata = List() --> (some list or Ienumerable type) 

现在我有一个通用方法,它从List创建一个XML对象 – 像这样的东西..

 public string GetXML(object listdata) { List objLists = (List)Convert.ChangeType(listData, typeof(List)); foreach(var obj in listdata) { //logic to create xml } } 

现在为了运行这个方法,我必须这样做:

 string xml = GetXML(myRoledata); 

现在我不知道Type可能会传给GetXML方法。 我有一个方法可以为不同的Type调用GetXML ,例如RolesUsers

现在我可以像这样获得ListType

 Type genericType = obj.GetType().GetGenericArguments()[0]; 

但不能像这样传递它

 string xml = GetXML(myRoledata); 

无论如何,我可以将任何genericTypes传递给GetXML方法吗?

这是您可能希望避免解决的问题。 通过reflection,可以动态地调用方法而无需静态地解析它们 – 但它有点击败了类型注释的全部要点。

要么这样做:

 public string GetXML(IEnumerable listdata) { foreach(object obj in listdata) //logic to create xml } 

…现在可以使用任何IEnumerable调用,或者将其写成“现代”方式:

 public string GetXML(IEnumerable listdata) { foreach(object obj in listdata) //logic to create xml } 

…你可以通过任何IEnumerable通过GetXML(someEnumerable.Cast())和C#4.0调用,甚至直接通过协方差。

如果您需要元素运行时的类型,您可以在每个元素上使用.GetType()来获取它,或者您可以将其作为参数传递(并为向后兼容性提供覆盖):

 public string GetXML(Type elementType, IEnumerable listdata) { foreach(object obj in listdata) //logic to create xml } public string GetXML(IEnumerable listdata) { return GetXML(typeof(T),listdata.Cast()); } 

顺便说一句,如果你正在构建XML,那么字符串可能是一个不太健壮的返回类型选择:如果可能的话,你可以使用类似XElement东西 – 并获得启动xml-validity保证。

要做到这一点,你需要使用reflection;

 typeof(SomeClass).GetMethod("GetXML").MakeGenericMethod(genericType) .Invoke(inst, new object[] {myRoleData}); 

如果inst是静态方法,则instnullthis对于当前实例(在这种情况下,您也可以使用GetType()而不是typeof(SomeClass) ),否则使用目标对象。

由于您在方法的第一行中将listdata参数转换为List ,为什么不将方法签名更改为

 public string GetXML(List listdata) 

这样,您就不必使用reflection来获取generics参数。

编辑:我看到你需要能够接受IEnumerable集合,而不仅仅是列表。 因此,请考虑将方法签名更改为

 public string GetXML(IEnumerable listdata) 

我不知道你的情况,但有可能将你的function重写为:

 public string GetXML(IEnumerable listdata) { foreach(var obj in listdata) { //logic to create xml } } 

然后它可以被称为:

 List myList; GetXML(myList); 

您可以根据需要添加类型参数以支持它,直到您到达确实知道固体类型的位置。

你有正确的想法,但你使用的是错误的方法。 看看Type.MakeGenericType或MethodInfo.MakeGenericMethod。 它将比你的例子多几行,但它应该很容易解决。

GetGenericArguments()可用于从List获取角色类型。 这是不同的方式。

顺便说一下:看起来你正在实现某种XML序列化。 在重新发明轮子之前,请确保检查现有的类。 😉