将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
,例如Roles
, Users
等
现在我可以像这样获得List
的Type
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
…你可以通过任何IEnumerable
通过GetXML(someEnumerable.Cast
和C#4.0调用,甚至直接通过协方差。
如果您需要元素运行时的类型,您可以在每个元素上使用.GetType()
来获取它,或者您可以将其作为参数传递(并为向后兼容性提供覆盖):
public string GetXML(Type elementType, IEnumerable
顺便说一句,如果你正在构建XML,那么字符串可能是一个不太健壮的返回类型选择:如果可能的话,你可以使用类似XElement
东西 – 并获得启动xml-validity保证。
要做到这一点,你需要使用reflection;
typeof(SomeClass).GetMethod("GetXML").MakeGenericMethod(genericType) .Invoke(inst, new object[] {myRoleData});
如果inst
是静态方法,则inst
为null
, this
对于当前实例(在这种情况下,您也可以使用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序列化。 在重新发明轮子之前,请确保检查现有的类。 ?
上述就是C#学习教程:将Type动态传递给分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1004319.html