当前位置: 首页 > 编程语言 > C#

获取泛型对象参数的实际类型分享

时间:2023-04-11 12:09:11 C#

GettingtheActualTypeofaGenericObjectParameter毫无疑问,这个问题的元素之前已经问过,但我找不到答案。(免责声明:这是相关的,但与我最近的问题不同)。我有一个这样的方法:publicstaticvoidMethod(MethodInfom,Tvalue){TypememberType=m.GetValueType();if(memberType.IsAssignableFrom(typeof(List)){objectmemberValue=Activator.CreateInstance(memberType);((List)memberValue).Add(value);}}当我这样称呼它时,它工作正常:strings="blah";Method(memberInfo,s);但是,我需要用泛型调用这个方法,所以我这样称呼它:TypevalueType=someType;objectpassValue=someMethod.MakeGenericMethod(newType[]{valueType}).Invoke(this,newobject[]{});/*调用我原来的方法*/Method(memberInfo,passValue);现在,intellisense知道Method中的“value”是任何类型的valueType(假设是“FooObject”).但是'T'是对象,这意味着不能从List(即List)分配List。我事先尝试过在变量('passValue')上使用Convert.ChangeType,但这没有做任何事情。由于变量无法转换为类型变量的类型,我该如何解决这个问题?最好的解决方案是以某种方式不依赖于IsAssignableFrom并进行更宽松的类型检查是否可行?这个问题是我不确定我是否能够正确转换memberValue,除非“T”确实是memberValue的元素类型。你很幸运,几周前我实际上不得不做一些非常相似的事情。有关详细说明,请参阅上面的博客文章,但基本上一般的想法是反映类型并使用一组显式参数手动调用方法。typeof(MyClass).GetMethod("Foo").MakeGenericMethod(new[]{param.GetType()}).Invoke(null,new[]{param});它不是很安全,但它完全符合您的要求。类程序{staticvoidMain(string[]args){objectstr="HelloWorld";对象数=5;对象obj=新对象();Console.WriteLine("vartvaluettFoo()TypetCallFoo()Type");Console.WriteLine("------------------------------------------------------");Console.WriteLine("{0}t{1}t{2}t{3}","str",str,MyClass.Foo(str),MyClass.CallFoo(str));Console.WriteLine("{0}t{1}tt{2}t{3}","num",num,MyClass.Foo(num),MyClass.CallFoo(num));Console.WriteLine("{0}t{1}t{2}t{3}","obj",obj,MyClass.Foo(obj),MyClass.CallFoo(obj));}}classMyClass{publicstaticTypeFoo(Tparam){returntypeof(T);}publicstaticTypeCallFoo(objectparam){return(Type)typeof(MyClass).GetMethod("Foo").MakeGenericMethod(new[]{param.GetType()}).Invoke(null,new[]{param});}}产量varvalueFoo()TypeCallFoo()Type----------------------------------------------------strHelloWorldSystem.ObjectSystem.Stringnum5System.ObjectSystem.Int32obj系统.ObjectSystem.ObjectSystem.Object这应该给你一个可调用的方法(我将在一段时间内测试它)它导致的装箱/拆箱比反射API调用所需的安全检查(也需要装箱)快得多。以上就是C#学习教程:获取通用对象参数的实际类型分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注—privatestaticActionBuildAccessor(TypevalueType){MethodInfogenericMethod=null;//expr=Expression.Lambda>(Expression.Call(method,methodInfo,Expression.Convert(obj,valueType)),methodInfo,obj);返回expr.Compile();}本文收集自网络,不代表任何内容,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢