我需要一個方法,如果傳入的類型可分配給(派生自)開放(無界)泛型類型的閉包,則返回true。該方法應該如下工作:如何使用相同類型的參數關閉類型是否可分配給開放泛型類型?
OpenGenericIsAssignableFrom(typeof(ICollection<>), typeof(IList<String>))
應該返回true。
我需要一個方法,如果傳入的類型可分配給(派生自)開放(無界)泛型類型的閉包,則返回true。該方法應該如下工作:如何使用相同類型的參數關閉類型是否可分配給開放泛型類型?
OpenGenericIsAssignableFrom(typeof(ICollection<>), typeof(IList<String>))
應該返回true。
擴展Check if a class is derived from a generic class,這裏是一個可能的解決方案:
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
}
爲什麼不乾脆關閉打開的泛型類型,看看是否是從封閉式assingable?美中不足的是,在相同的參數關閉它可能是無效的,所以你就需要趕上
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));
}
}
因爲typeToCheck的類型參數只是它的類型參數(可能不是),而不是它的超類的類型參數。例如,如果'Length:Measurement
@silasdavis足夠公平的被你的例子愚弄,只使用泛型來相信你會傳遞泛型。相應更新 –
啊是的我發佈了類似的東西,但我們仍然需要爬繼承樹,請參考:IA
在這種情況下,將'c.IsAssignableFrom(一)'收益率從'c.IsAssignableFrom一個不同的結果(b)「如果a來源於b? –
如果'c.IsAssignableFrom(b)'爲真,則兩者都應該返回true,如果'c.IsAssignableFrom(a)'爲假,給定爲'a:b',則兩者都爲false。但是'c.IsAssignableFrom(b)'在'c.IsAssignableFrom(a)'在它們之間時爲真,或者是'a'的接口而不是'b'時可能是錯誤的... – silasdavis