草庐IT

c# - .NET:如何检查泛型类中的类型?

如何在类中获取泛型类的类型?一个例子:我构建了一个实现ICollection的通用类型化集合。在我里面有像这样的方法publicvoidAdd(Titem){...}publicvoidAdd(IEnumerableenumItems){...}如何在方法中请求给定类型T?我的问题的原因是:如果object用作T集合使用Add(objectitem)而不是Add(IEnumerableenumItems)即使参数是IEnumerable。因此,在第一种情况下,它将整个可枚举集合添加为一个对象,而不是可枚举集合的多个对象。所以我需要类似的东西if(Tisobject){//Checkfo

c# - C# 中具有类型参数的泛型类型

我不认为这可以在C#中完成,但发布它只是为了确保。这是我的问题。我想在C#中做这样的事情:varx=10;varl=newList();或varx=10;vart=typeof(x);varl=newList();但这当然行不通。尽管这应该不是问题,因为类型t在编译时已解析。我知道这可以通过反射来解决,但由于类型在编译时是已知的,因此使用反射就太过分了。 最佳答案 publicstaticListCreateCompatibleList(Tt){returnnewList();}varx=10;varl=CreateCompatib

c# - 使用类型泛型时如何正确地将类转换为抽象类?

我有以下类(class)publicabstractclassBaseViewPresenter{}publicabstractclassBaseView:UserControlwhereT:BaseViewPresenter{}publicclassLoginPresenter:BaseViewPresenter{}publicpartialclassLoginView:BaseView{}我有一个看起来像这样(简化)的方法publicBaseViewResolve(BaseViewPresentermodel){vartype=model.GetType();varviewType

C# 泛型通配符或如何保存对未知泛型继承的引用

好的,情况是这样的。我有一个FlexCollection类,其目的是保存FlexItem的一些专业列表,因此:publicclassFlexCollectionwhereT:FlexItem,new(){publicvoidAdd(Titem){...}...}FlexItem不是泛型类本身。我想要实现的是能够保持FlexItem的字段是对包含该对象的集合的引用。不幸的是,在C#中,不可能保留对模板类的“任何”特化的引用(如在Java中)。起初我尝试使用非通用接口(interface)IFlexCollection但它实际上迫使我对每个方法执行两次,即:publicclassFlexC

c# - 在 Visual Studio 中突出显示泛型类型的语法

看看下面的代码:publicclassMyClass{...}在eclipse中使用Java或C++时,T将突出显示,因为它是一个通用模板。如何在VisualStudio中实现此功能? 最佳答案 正如@MichaelSander提到的,UserTypes会提供此功能,但只是以一种不方便和部分的方式。假设此功能对您有用,下面是您如何根据需要为泛型类型着色。“usertypes.dat”文件必须由您创建为基本文本文件,并且必须保存到与VisualStudio可执行文件相同的位置。创建后,在单独的行中列出每个所需的“通用类型名称”。一个例

c# - 为什么我需要在泛型子类中重新声明类型约束

最近我尝试通过实现一个泛型接口(interface)来创建一个泛型子类。publicinterfaceIModulewhereT:DataBean{.....}publicclassModule:IModulewhereT:DataBean{....}看来我不能依赖在基本接口(interface)中定义的任何T限制,我需要自己重新申报。MSDN刚刚提供:Whenusingthesubclassgenerictypeparameters,youmustrepeatanyconstraintsstipulatedatthebaseclasslevelatthesubclasslevel.F

c# - 基于泛型约束的方法重载?

我能否以某种方式拥有仅因泛型类型约束而不同的重载方法?这不编译:voidFoo(Tbar)whereT:class{}voidFoo(Tbar)whereT:struct{}由于这些是“开放”方法,当在代码中使用具体类型的T引用实际方法时,实际方法应该是封闭的/构造的/完全定义的,然后就会清楚是哪个过载调用。显而易见的解决方案是不要重载它们,但我想知道为什么这在C#中不起作用?附加问题:如果这只是一个C#编译器约束,IL是否允许这样的重载? 最佳答案 CanIsomehowhaveoverloadedmethodswhichdiff

c# - 限制方法中泛型类型的目的是什么?

我很难理解为什么这样做会有益:(示例是一个类)staticvoidPrintResults(Tresult)whereT:Sample将Sample传递给方法不是更好吗?staticvoidPrintResults(Sampleresult) 最佳答案 我建议避免使用非泛型语法的泛型类型,例如您给出的示例。但是,还有其他有用的案例。例如,一般指定返回类型:staticTCreate()whereT:Sample,new(){returnnewT();}//CallingcodeSamplesample=Create();代替stat

c# - 我可以将类型对象传递给泛型方法吗?

这个问题在这里已经有了答案:HowdoIusereflectiontocallagenericmethod?(8个答案)关闭8年前。我的DataAccessLayer上有一个FindAll方法,如下所示:publicFindResultFindAll()whereT:Entity,new()和一个具有Type[]数组的客户端代码,它需要使用它来迭代调用FindAll方法,如下所示:foreach(vartypeintypeArray){varresult=DataAccessLayer.FindAll();...但是编译器提示“需要类型或命名空间”。有没有简单的方法来解决这个问题?我试

C#泛型是盒装的?

我执行了以下代码:usingSystem;usingSystem.Collections.Generic;namespaceTestReleaseAndDebug{publicclassGClass{publicT1Name{get;set;}publicT2Age{get;set;}publicvoidDisplay(){Console.WriteLine("Name:"+Name);Console.WriteLine("Age:"+Age);}}classProgram{staticvoidMain(string[]args){GClassperson=newGClass();pe