在C#中强制转换为反射类型

用户名

考虑以下代码:

object objFoo = MakeFoo(); // object MakeFoo(){return new Foo();}
MethodInfo methodInfo = typeof(Program).GetMethod("Baz"); // Foo Baz(){return foo;}
Type typeFoo = methodInfo.ReturnType;
var result = (typeFoo)objFoo;

我需要做一些魔术typeFoo才能得到结果吗?

Xanatos

不 :-)

情况1:

object objFoo = MakeFoo(); // object MakeFoo(){return new Foo();}
Foo result = (Foo)objFoo;

这里没有反射,因为您Foo在编译时就知道类型。

情况2:接口。通常是最好的一个...您不知道确切MakeFoo返回什么,但是您知道它是一个IFoo接口...

object objFoo = MakeFoo(); // object MakeFoo(){return new Foo();}
IFoo result = (IFoo)objFoo;

情况3:您不确定会MakeFoo得到回报Foo

object objFoo = MakeFoo(); // object MakeFoo(){return new Foo();}

if (objFoo is Foo)
{
    Foo result = (Foo)objFoo;
}

或类似

object objFoo = MakeFoo(); // object MakeFoo(){return new Foo();}

Foo foo = objFoo as Foo;

if (foo != null)
{
    // use foo
}

情况4:Foo程序完全不知道类型您没有可Foo参考课程...

object objFoo = MakeFoo(); // object MakeFoo(){return new Foo();}
Type typeFoo = objFoo.GetType(); // You should check for null values before!

// and now?

dynamic foo = objFoo;

// because you know that foo can Quack(1, 2, 3)!
string result = foo.Quack(1, 2, 3); 

// note that it will explode with a RuntimeBinderException if there is no 
// string Quack(int, int, int) method!

dynamic内部使用反射。您可以直接使用反射来获取Quack方法并调用它

情况5:与情况4相同,但直接使用反射:

object objFoo = MakeFoo(); // object MakeFoo(){return new Foo();}
Type typeFoo = objFoo.GetType(); // You should check for null values before!
MethodInfo mi = type.GetMethod("Quack"); // You should check if the Quack method
                                         // exists
string result = (string)mi.Invoke(objFoo, new object[] { 1, 2, 3 });

或者,通过一些健全性检查,如果您不确定是否foo可以Quack正确进行以下操作:

MethodInfo mi = type.GetMethod("Quack", 
                    BindingFlags.Instance | BindingFlags.Public, 
                    null, 
                    new[] { typeof(int), typeof(int), typeof(int) }, 
                    null);

if (mi != null && typeof(string).IsAssignableFrom(mi.ReturnType))
{
    string result = (string)mi.Invoke(objFoo, new object[] { 1, 2, 3 });
}

Case -Infinity:Foo程序完全不知道类型您没有可Foo引用类。您没有IFoo界面。您甚至都不知道aFoo什么,只知道它是一堂课(或者也许是盒装的struct,但是从您的角度来看并没有改变……这不可能是interface因为最后,必须始终是具体的class/struct落后于每个interface)。您不知道它的方法,它的字段,它的属性(因为您不知道它是什么Foo)。

即使您可以将an转换object为这个未知的类,您也可以做什么?您的代码中不能有接受它作为参数/返回值的方法,因为如果您在某处:

int INeedFoo(Foo par) { return 0; }

那么显然你会知道的Foo.NET库不能有接受它作为参数/返回值的方法,因为如果有的话,您就会知道Foo

您唯一可以做的就是将其传递给通过反射发现的其他一些接受Foo为参数的Invoke方法...但是该方法接受object作为参数的数组...您不需要强制object转换Invoke您只需要将其放入数组中即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章