渡された型がオープンな (無制限の) ジェネリック型のクロージャに代入可能 (派生) である場合に true を返すメソッドが必要です。メソッドは次のように機能する必要があります。
OpenGenericIsAssignableFrom(typeof(ICollection<>), typeof(IList<String>))
true を返す必要があります。
渡された型がオープンな (無制限の) ジェネリック型のクロージャに代入可能 (派生) である場合に true を返すメソッドが必要です。メソッドは次のように機能する必要があります。
OpenGenericIsAssignableFrom(typeof(ICollection<>), typeof(IList<String>))
true を返す必要があります。
開いているジェネリック型を単純に閉じて、それが閉じた型から代入可能かどうかを確認してみませんか? キャッチは、同じ引数で閉じることが有効ではない可能性があるため、それをキャッチする必要があるということです
private static bool OpenGenericIsAssignableFrom(
Type openGenericType,
Type typeToCheck)
{
if (!openGenericType.IsGenericType || typeToCheck == null) return false;
if(typeToCheck.IsGenericType)
{
var typeArgs = typeToCheck.GetGenericArguments();
if (typeArgs.Length == openGenericType.GetGenericArguments().Length)
{
try
{
var closed = openGenericType.MakeGenericType(typeArgs);
return closed.IsAssignableFrom(typeToCheck);
}
catch
{
//violated type contraints
return false
}
}
}
else
{
return OpenGenericIsAssignableFrom(openGenericType, typeToCheck.BaseType)
|| typeToCheck.GetInterfaces()
.Any(i=> OpenGenericIsAssignableFrom(openGenericType,i));
}
}
クラスがジェネリッククラスから派生しているかどうかを確認します。考えられる解決策は次のとおりです。
private static bool OpenGenericIsAssignableFrom1(Type openGenericType, Type typeToCheck)
{
return typeToCheck != null && typeToCheck != typeof(Object) && // Terminate recursion
((typeToCheck.IsGenericType && (typeToCheck.GetGenericTypeDefinition() == openGenericType)) || // typeToCheck is as closure of openGenericType
OpenGenericIsAssignableFrom(openGenericType, typeToCheck.BaseType) || // typeToCheck is the subclass of a closure of openGenericType
typeToCheck.GetInterfaces().Any(interfaceType => OpenGenericIsAssignableFrom(openGenericType, interfaceType))); // typeToCheck inherits from an interface which is the closure of openGenericType
}