不 :-)
案例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();
if (objFoo is Foo)
或者,类似的
object objFoo = MakeFoo(); // object MakeFoo(){return new Foo();}
Foo foo = objFoo as Foo;
if (foo != null)
{
// use foo
}
第四种情况:类型为Foo
的对象对于您的程序来说完全未知。您没有可引用的Foo
类...
object objFoo = MakeFoo();
Type typeFoo = objFoo.GetType();
dynamic foo = objFoo;
string result = foo.Quack(1, 2, 3);
dynamic
内部使用反射。你可以直接使用反射获取 Quack
方法并调用它。
Case 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 });
}
情况-Infinity: 类型Foo
完全未知于您的程序。您无法引用Foo
类。您也没有IFoo
接口。您甚至不知道Foo
是什么,您只知道它是一个类(或者可能是一个装箱的struct
,但从您的角度来看它并没有改变...它不能是一个interface
,因为最终每个interface
都必须有一个具体的class
/struct
支持)。您不知道其方法、字段和属性(因为您不知道Foo
是什么)。
即使您可以将一个object
转换为此未知类,您能做什么呢?您不能在代码中编写接受它作为参数/返回值的方法,因为如果某处您写了:
int INeedFoo(Foo par) { return 0; }
那么显然你应该知道 Foo
。.NET库不能有接受它作为参数/返回值的方法,因为如果有的话,你就会知道 Foo
。
你唯一能做的就是将它传递给一些通过反射发现接受Foo
作为参数的其他方法... 但是Invoke
方法接受一个object
数组作为参数... 你不需要将你的object
强制转换来调用Invoke
!你只需要将它放在数组中即可。
Foo result
之后你想要做什么吗? - Satish Bejgum