以下程序正常运行。但是,我想将其更改为不使用InvokeMember。我希望能够将CreateInstance的返回值转换为GenericBase并直接调用Foo方法。在此代码示例中,我知道类型是Derived。但是,在我的实际代码中,我所知道的是该类型是从GenericBase派生的。我将对象强制转换为 GenericBase 的所有尝试都无法编译。 C#坚持在演员表中使用GenericType时提供type参数。
这可能吗?
using System;
using System.Collections.Generic;
using System.Text;
namespace GenericTest
{
class Program
{
static void Main(string[] args)
{
Type t = typeof(Derived);
object o = Activator.CreateInstance(t);
t.InvokeMember("Foo", System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] { "Bar" });
}
}
class GenericBase<T>
{
public void Foo(string s)
{
Console.WriteLine(s);
}
}
class Derived : GenericBase<int>
{
}
}
答案 0 :(得分:3)
先验地,您对GenericBase<Bar>
和GenericBase<Baz>
之间可能存在的常见功能一无所知。他们可能没有任何共同之处。因此,在不知道父类通用类的类型的情况下,您实际上对该对象一无所知。
现在,另一方面,很明显你在这个特定的例子中说的是 在GenericBase<Bar>
之间有共同点GenericBase<Baz>
- 它们都实现了非通用void Foo(string s)
。因此,为了能够对您的对象做一些有用的事情,您需要将此行为正式化;将Foo
放入非通用IFoo
接口,并GenericBase<T>
实现接口。然后,您可以将对象投射到IFoo
,然后调用Foo
。