我有一个带签名的方法
string GenericMethod<T>();
通常你只需用:
来称呼它var result = GenericMethod<AType>();
但是,这对我的情况不起作用,因为AType
作为Type
传递给父方法。
下面的代码显示了我必须去的地方。目前它错误为// ERROR HERE。
在代码之前,快速解释:TestClass
同时实现ITestClass
和INotTestClass
。这很重要,因为这里的要点是,如果我传递TestClass
,我会想要使用ITestClass
调用该方法,而不是INotTestClass
。
TestClass
有一个方法只返回其通用括号中的类型名称。
好的,这是代码测试形式的代码。
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 { }
}
答案 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());