0

私のコードでは、(少なくとも)2つのオープンジェネリックインターフェイスを実装するオープンジェネリッククラスを表す型オブジェクトを取得します。これらのインターフェースの少なくとも1つ(例ではIGiveOneValue)は私が知っています。完全で実用的な例を次に示します。

using System;
namespace ConsoleApplication22
{
    interface IGiveOneValue<T>
    {
        T Value { get; }
    }

    interface IGiveAnother<T>
    {
        T Value { get; }
    }

    class ValueImplementation<T1, T2> : IGiveOneValue<T1>, IGiveAnother<T2>
    {
        public ValueImplementation(T1 value1, T2 value2)
        {
            v1 = value1;
            v2 = value2;
        }

        T1 v1;
        T2 v2;

        T1 IGiveOneValue<T1>.Value { get { return v1; } }
        T2 IGiveAnother<T2>.Value { get { return v2; } }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var genericArguments = typeof(ValueImplementation<,>).GetGenericArguments();
            // genericArguments.Length == 2
            // how can I tell which argument will fulfill IGiveOneValue<T>?
            // assuming they could be implemented in any order

            // these parameters might be in the wrong order:
            var closedType = typeof(ValueImplementation<,>).MakeGenericType(new[] { typeof(int), typeof(string)});
            var instance = Activator.CreateInstance(closedType, 1, "2");
        }
    }
}

リフレクションを使用して、ValueImplementation <、>クラスの開いているジェネリック引数のどれがIGiveOneValueのメンバーに対応するかを判断して、MakeGenericTypeメソッドで特定の型を渡すことができるようにするにはどうすればよいですか?

4

1 に答える 1

2

GetInterfacesメソッドは、型のインターフェイスを取得し、GetGenericArgumentsを使用することもできます。したがって、タイプが実装するインターフェイスがどのタイプ制約を使用するかを知りたい場合は、次のことを試してください。

var genericArguments = typeof(ValueImplementation<,>).GetGenericArguments();
var implementedInterfaces = typeof(ValueImplementation<,>).GetInterfaces();

foreach (Type _interface in implementedInterfaces) {
    for (int i = 0; i < genericArguments.Count(); i++) {
        if (_interface.GetGenericArguments().Contains(genericArguments[i])) {
            Console.WriteLine("Interface {0} implements T{1}", _interface.Name, i + 1);
        }
    }
}

うまくいけば、私はあなたの質問を理解し、これがいくつかのガイダンスを提供することを理解しました。

于 2012-08-09T02:42:27.720 に答える