有没有办法确定泛型类型是否是从特定的泛型类型定义构建的?我有一个通用方法:FuncCreateFunction()其中T可以是任意数量的不同类型。这个方法使用反射做了一堆事情,如果T是一个IDictionary,不管字典的TKey和TValue我需要执行字典特定的代码。因此可以调用该方法:varf=CreateFunction();varf0=CreateFunction();varf1=CreateFunction();varf2=CreateFunction();varf3=CreateFunction();等基于@Andy的回答的澄清最后我想知道Tinheritance是否自我/实现IDictionary即使T本身是Dictionary或从该接口派生的其他类型。if(typeof(T)==typeof(IDictionary)不起作用,因为T是泛型类型而不是泛型类型定义。并且不知道TKey和TValue(在编译时不知道),我无法在运行时分辨我知道要比较的任何具体类型。我唯一能想到的就是查看类型的名称或通过反射检查它,寻找让我相信它是字典的方法(即寻找ContainsKey和get_Item).有没有一种直接的方法可以做出这种决定?你可以做一些事情classProgram{staticvoidMain(string[]args){Example>.IsDictionary();示例>.IsDictionary();示例>.IsDictionary();控制台.ReadKey();}}publicclassExample{publicstaticvoidIsDictionary(){if(typeof(T).GetInterface(typeof(IDictionary).Name)!=null||typeof(T).Name.Contains("IDictionary")){控制台.WriteLine("是IDictionary");}else{Console.WriteLine("NotIDictionary");您可以使用IsGenericType和GetGenericTypeDefinition成员来避免丑陋且具有潜在风险的类型名称字符串检查,如下所示:vartype=typeof(T);if(typeof(IDictionary).IsAssignableFrom(type)){//非通用字典}elseif(type.IsGenericType&&type.GetGenericTypeDefinition()==typeof(IDictionary)){//通用字典接口}elseif(type.GetInterfaces().Any(i=>i.IsGenericType&&i.GetGenericTypeDefinition()==typeof(IDictionary))){//实现通用字典}简单的方法是这样的:TypeiDict=null;if(typeof(T).GetGenericTypeDefinition()==typeof(IDictionary))iDict=typeof(T);否则iDict=typeof(T).GetInterface(typeof(IDictionary).Name);if(iDict!=null){vargenericParams=iDict.GetGenericArguments();输入tKey=genericParams[0],tValue=genericParams[1];请注意,如果T实现了多个IDictionary接口,这将不起作用(抛出异常),但这可能对您的完整性有用为了完整起见,这里是一个将使用具有多个IDictionary接口的第一种类型的实现:TypeiDict=t.GetType().GetInterfaces().Where(t=>t.IsGenericType&&t.GetGenericTypeDefinition()==typeof(IDictionary)).FirstOrDefault();if(iDict!=null){vargenericParams=iDict.GetGenericArguments();输入tKey=genericParams[0],tValue=genericParams[1];注意,在第二种情况下,在第一个例程中,t是对象,T是第一个例程中的类型。我认为如果您调用Type.GetGenericTypeDefinition(),它应该返回用于构造具体类型的“基本”泛型类型。请注意,将其与IDictionary进行比较可能还不够,因为如果有人传入Dictionary的实例,我认为您也想使用它。您可以检查Type是否实现了IDictionary,或者您可以调用Type.IsAssignableFrom(),尽管根据文档我不确定这对泛型类型的效果如何。以上是C#学习教程:有没有办法判断一个泛型类型是否是从一个特定的泛型类型定义中构建出来的?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: