私のコードでは、(少なくとも)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メソッドで特定の型を渡すことができるようにするにはどうすればよいですか?