在使用Activator.CreateInstance创建的泛型基类上调用方法

时间:2009-06-18 03:41:49

标签: c# generics

以下程序正常运行。但是,我想将其更改为不使用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>
    {
    }
}

1 个答案:

答案 0 :(得分:3)

先验地,您对GenericBase<Bar>GenericBase<Baz>之间可能存在的常见功能一无所知。他们可能没有任何共同之处。因此,在不知道父类通用类的类型的情况下,您实际上对该对象一无所知。

现在,另一方面,很明显你在这个特定的例子中说的是 GenericBase<Bar>之间有共同点GenericBase<Baz> - 它们都实现了非通用void Foo(string s)。因此,为了能够对您的对象做一些有用的事情,您需要将此行为正式化;将Foo放入非通用IFoo接口,并GenericBase<T>实现接口。然后,您可以将对象投射到IFoo,然后调用Foo