调用字符串GenericMethod <t>()而不指定T </t>

时间:2012-08-23 16:23:16

标签: c# generics delegates

我有一个带签名的方法

string GenericMethod<T>();

通常你只需用:

来称呼它
var result = GenericMethod<AType>();

但是,这对我的情况不起作用,因为AType作为Type传递给父方法。

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

在代码之前,快速解释:TestClass同时实现ITestClassINotTestClass。这很重要,因为这里的要点是,如果我传递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 { }
}

2 个答案:

答案 0 :(得分:2)

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

var methodInfo = t.GetMethod("GetTheType");
var methodWithType = methodInfo.MakeGenericMethod(t1);
methodWithType.Invoke(this, null);

答案 1 :(得分: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());