草庐IT

Generics

全部标签

c# - Activator.CreateInstance(string) 和 Activator.CreateInstance<T>() 的区别

不,这不是关于泛型的问题。我有一个工厂模式,其中包含几个带有内部构造函数的类(如果不通过工厂,我不希望它们被实例化)。我的问题是CreateInstance失败并出现“没有为此对象定义无参数构造函数”错误,除非我在非公共(public)参数上传递“true”。例子//FailsActivator.CreateInstance(type);//WorksActivator.CreateInstance(type,true);我想使工厂通用化以使其更简单一些,如下所示:publicclassGenericFactorywhereT:MyAbstractType{publicstaticTG

c# - T 必须是具有公共(public)无参数构造函数的非抽象类型,以便将其用作泛型类型或方法中的参数 'TModel'

我尝试在SO中搜索答案并偶然发现了类似的问题,但我无法使用它们来解决我的问题,因此请尽量不要将其标记为重复。让我们继续进行真正的交易:我有一个用于标准化EntityFramework数据库优先模型的通用库。这些是我创建的通用类:publicabstractclassGenericLookupModel:IActive,ICreated,IModified,IIdentity,IStringValue{publicboolis_active{get;set;}publicstringvalue{get;set;}publicstringdescription{get;set;}publi

c# - 如何将 float 和泛型相乘?

我正在使用C#在OSX上的Unity3.4.2中编程。我有一个类如下:classFoo{publicTDoFoo(Tbar){floataFloatValue=1.0f;//Dootherstuff...returnaFloatValue*bar;}}当Unity编译这个类时,它给我这个错误信息:errorCS0019:Operator*'cannotbeappliedtooperandsoftypefloat'and`T'我知道我为T提供的类型将支持float乘法。在这种情况下,我该如何实现泛型乘法? 最佳答案 啊哈,好样的Has

无法从具有多个返回的 Select 中的用法推断出 C# 类型参数

我不认为我在做任何太深奥的事情,但我没有看到任何其他关于此的问题。以下代码(我已将其简化为基本要素)在C#4中生成编译器错误。但是,类型参数是什么应该是显而易见的-最大公分母(“A类”)也是在方法“Frob”的返回类型中明确定义。编译器不应该列出lambda表达式中的所有返回类型,创建一个祖先树来找到它们的共同祖先,然后将其与包含方法的预期返回类型进行协调吗?Thetypeargumentsformethod'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)'cannotb

c# - Lazy<T> 延迟加载错误 : A field initializer cannot reference the non-static field, 方法或属性

我第一次尝试使用延迟加载来初始化我的类中的进度对象。但是,我收到以下错误:Afieldinitializercannotreferencethenon-staticfield,method,orproperty.privateLazym_progress=newLazy(()=>{longtotalBytes=m_transferManager.TotalSize();returnnewProgress(totalBytes);});在.NET2.0中,我可以执行以下操作,但我更愿意使用更新的方法:privateProgressm_progress;privateProgressPro

c# - 编译器将显式转换为我自己的类型替换为显式转换为 .NET 类型?

我有以下代码:publicstructNum{privatereadonlyT_Value;publicNum(Tvalue){_Value=value;}staticpublicexplicitoperatorNum(Tvalue){returnnewNum(value);}}...doubled=2.5;Numb=(Num)d;这段代码编译通过了,这让我很惊讶。显式转换应该只接受byte,不是double.但不知何故,双重被接受了。当我在转换中放置一个断点时,我看到value已经是byte具有值(value)2.从double转换为byte应该是显式的。如果我用ILSpy反编译我的

c# - 哈希表到 Dictionary<> syncroot 。

哈希表具有同步根属性,但通用字典没有。如果我有这样做的代码:lock(hashtable.Syncroot){....}如果我要删除哈希表并更改为通用词典,我该如何复制它? 最佳答案 如果您严格要求兼容性,那么Bryan是正确的。这是在字典之上维护当前语义的最佳方式。虽然扩展了它。SyncRoot属性没有直接添加到通用字典的原因是它是一种危险的同步方式。它只比非常危险且容易出现死锁的“lock(this)”好一点点。这里有几个链接说明了为什么这是不好的。http://blogs.msdn.com/bclteam/archive/20

c# - 将值从字符串转换为 Guid 或 int 的泛型类型

我有一个通用方法,可以将id从字符串(例如,从ASP.NET窗体上的HiddenField的值中检索)转换为目标类型并对其执行某些操作。privatevoidMyMethod(stringrawId,ActiondoSomethingWithId){Tid=(T)Convert.ChangeType(rawId,typeof(T));doSomethingWithId(id);}T将是Guid或Int32,当它是Guid时,上面的代码(在运行时)失败,表示从String到Guid的转换无效。然后我想我可能会尝试检查类型,如果是Guid,则实例化一个新的Guid:varid=defaul

c# - 列出标志 Enum 中的所有位名称

我正在尝试创建一个辅助方法来列出枚举值中设置的所有位的名称(用于记录目的)。我想要一个方法来返回在某些变量中设置的所有枚举值的列表。在我的例子中[Flag]EnumHWResponse{None=0x0,Ready=0x1,Working=0x2,Error=0x80,}我给它0x81,它应该给我一个IEnumerable包含{Ready,Error}.由于没有找到更简单的方法,我试着写了下面的代码,但我无法编译。publicstaticIEnumerableMaskToList(Enummask){if(typeof(T).IsSubclassOf(typeof(Enum))==fa

C#:微软为什么不让 ReadOnlyCollection<T> 继承自 ReadOnlyCollectionBase?

简单的说,微软定义了一个ReadOnlyCollectionBase,但没有将其用作ReadOnlyCollection的基类当听起来很明显应该是这样的时候。我是不是漏掉了什么?我的意思是,是否有充分的理由不将此类作为基类? 最佳答案 可能是因为它不是通用的并且实现了ICollection而ReadOnlyCollection是通用的并实现了ICollection.注意ICollection不执行ICollection.在那topic:ICollectionseemslikeICollection,butit’sactuallyav