3

署名付きのメソッドがあります

string GenericMethod<T>();

通常、これは次のように単純に呼び出します。

var result = GenericMethod<AType>();

ATypeただし、親メソッドに として渡されるため、私の場合はうまくいきませんType

以下のコードは、私が到達した場所を示しています。現在、 //ERROR HERE としてエラーが発生しています。

コードの前に、簡単な説明:と の両方をTestClass実装します。ここでのポイントは、 が渡された場合、 ではなくを使用してメソッドを呼び出したいため、これは重要です。 型の名前を一般的な角かっこで単純に返すメソッドがあります。ITestClassINotTestClassTestClassITestClassINotTestClassTestClass

わかりました、これが単体テストの形式のコードです。

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 に答える