3

我有一个带有签名的方法

string GenericMethod<T>();

通常你会简单地调用它:

var result = GenericMethod<AType>();

但是,这不适用于我的情况,因为AType它作为Type.

下面的代码显示了我要去的地方。目前它错误为 //ERROR HERE。

在代码之前,快速解释一下:TestClass同时实现ITestClassINotTestClass。这很重要,因为这里的重点是,如果我通过 a TestClass,我想用 调用该方法ITestClass,而不是INotTestClassTestClass有一个方法,它只是在其泛型括号中返回类型的名称。

好的,这是单元测试形式的代码。

using System;
using NUnit.Framework;

namespace Ian.Tests
{   
    [TestFixture]
    public class MiscTests
    {
        [Test]
        public void WhoWeCallingTest()
        {
            var i = new TestClass();
            i.TestGetTheType();
        }
    }

    public class TestClass : ITestClass, INotTestClass
    {
        public void TestGetTheType()
        {
            var t1 = typeof(ITestClass);
            var t2 = typeof(INotTestClass); 

            var t = GetType();

            // so I can make a delegate normally, but no use as I don't have this info usually.
            var dummyFunc = new MyDelegate<ITestClass>(GetTheType<ITestClass>);


            var methodInfo = t.GetMethod("GetTheType");
            var baseType = typeof(MyDelegate<>);
            var delType = baseType.MakeGenericType(t1);
            //ERROR HERE.
            var del = Delegate.CreateDelegate(delType, this, methodInfo);
            del.Method.Invoke(this, null);

        }

        public delegate string MyDelegate<T>();

        public string GetTheType<T>()
        {
            return typeof(T).Name;
        }
    }

    public interface ITestClass { }

    public interface INotTestClass { }
}
4

2 回答 2

2

您需要使用MethodInfo.MakeGenericMethod来构造适当的方法:

var methodInfo = t.GetMethod("GetTheType");
var methodWithType = methodInfo.MakeGenericMethod(t1);
methodWithType.Invoke(this, null);
于 2012-08-23T16:28:15.173 回答
0

我必须承认我不完全理解您的要求,但在这种特殊情况下,简单的检查还不够吗?

if(this is ITestClass)
    return this.GetTheType<ITestClass>();
else if(this is INotTestClass)
    return this.GetTheType<INotTestClass>();
else 
    throw new InvalidOperationException // or whatever
                ("unexpected type: " + this.GetType());
于 2012-08-23T16:53:17.813 回答