Tag: generics

这种使用generics的模式有名称吗?

//this class (or interface if you like) is set up as generic… public abstract class GenericBase { public T PerformBasicTask(T in) { … } } //… but is intended to be inherited by objects that close the generic… public class ConcreteForDates:GenericBase { public DateTime PerformSpecificTask(DateTime in) { … } } //… so that consuming code […]

C#:如何使用带有“out”变量的generics方法

我想创建一个简单的通用函数 void Assign(out T result) { Type type = typeof(T); if (type.Name == “String”) { // result = “hello”; } else if (type.Name == “Int32”) { // result = 100; } else result = default(T); } 用法: int value; string text; Assign(value); // <<< should set value to 100 Assign(text); // <<< should set text […]

是否可以创建将项添加到entity frameworkdbset的通用方法?

我之前没有使用Entity Framework或generics,并且在减少代码方面遇到了一些困难。 我正在解析一个文本文件来加载10个查找表,其中的数据可能会在每晚更改。 文本文件具有“类型”的标题,后跟键/值集的列表。 我有这个完美的工作,但我想重构代码来清理它,并希望使用generics方法来实现这一点,所以我可以减少重复的代码。 我已经解析为generics方法,但我无法弄清楚如何以通用方式将实体添加到上下文中。 我必须遍历每种类型的实体列表并将它们添加到上下文中: void Main() { switch (line.ToUpper()) { case “AREA”: { List areaList = this.GetItems(file); foreach (var element in areaList) { if (context.Area.Find(element.Id) == null) { context.Area.Add(element); } } break; } case “CATEGORY”: { List categoryList = this.GetItems(file); foreach (var element in categoryList) { if (context.Category.Find(element.Id) == null) { context.Category.Add(element); […]

隐式地将generics转换回T

如果我写类MyGeneric这样的generics类是可以写一个隐式MyGeneric为类型T,所以我可以这样做: public class MyGeneric { … } public class GenericProperties { public MyGeneric MyGenericString {get;set;} public void UseMyGeneric() { string sTest = MyGenericString; MyGenericString = “this is a test”; } } 可以通过重载运算符来实现吗? 我知道如果我的class级不是通用的话可以做到……

不同的Generics T在同一个集合中

public abstract Column { private T Value {get;set;} public abstract string Format(); } public class DateColumn : Column { public override string Format() { return Value.ToString(“dd-MMM-yyyy”); } } public class NumberColumn : Column { public override string Format() { return Value.ToString(); } } 我遇到的问题是将这些添加到通用集合中。 我知道它可能,但我怎样才能在集合中存储多种类型等 IList<Column> columns = new List<Column() 我真的很感激有关实现这一目标的任何建议。 目标是将不同的列类型存储在同一个List中。 值得一提的是我使用NHibernate和鉴别器来加载适当的对象。最后,Value需要具有类的类型。 非常感谢您的帮助。

我知道typeof(T)但编译器没有。 怎么修?

我正在尝试编写这样的方法: public static T Test() { if (typeof(T)==typeof(string)) return “1241”; // do something else } 但我似乎无法弄清楚如何把它拉下来。 我想根据调用方法的T类型返回值。 我需要返回字符串,int,自定义类,List等。 实际的用例是一些自定义序列化代码,其中反序列化代码必须知道它应该生成的对象的类型。 澄清:上面的示例给出以下错误:无法将字符串转换为类型T. 理想的解决方案适用于值类型和引用类型,并且不包含用于重载解析的虚拟参数。 我开始怀疑是否存在理想的解决方案。 谢谢,卢卡斯

CodeDomgenerics类型约束

有没有办法用CodeDom生成类约束。 因为当我使用类似的东西 var method = new CodeMemberMethod(); var genericParam = new CodeTypeParameter(“InterfaceType”); genericParam.Constraints.Add(“class”); method.TypeParameters.Add(genericParam); 生成的代码就像 private InterfaceType GetImpl() where InterfaceType : @class { } 我发现最好的解决方法是在课前使用前导空格 genericParam.Constraints.Add(” class”); 但这似乎充其量只是一种解决方法。

编译器使用显式转换为.NET类型将显式转换替换为我自己的类型?

我有以下代码: public struct Num { private readonly T _Value; public Num(T value) { _Value = value; } static public explicit operator Num(T value) { return new Num(value); } } … double d = 2.5; Num b = (Num)d; 这段代码编译,令我惊讶。 显式转换应该只接受一个byte ,而不是一个byte 。 但双重被接受了。 当我在转换器中放置断点时,我看到该value已经是值为2的byte 。 通过从double到byte的转换应该是显式的。 如果我用ILSpy反编译我的EXE,我会看到下一个代码: double d = 2.5; Program.Num b = (byte)d; […]

将非generics集合转换为generics集合的最佳方法

将非generics集合转换为generics集合的最佳方法是什么? LINQ有办法吗? 我有以下代码。 public class NonGenericCollection:CollectionBase { public void Add(TestClass a) { List.Add(a); } } public class ConvertTest { public static List ConvertToGenericClass( NonGenericCollection collection) { // Ask for help here. } } 谢谢!

哪些值类型存储在(C#)通用集合中

确实,generics集合比值非类型的非generics集合表现更好。 (即List与ArrayList)。 但除了拳击拆箱步骤之外,为什么呢? 一旦添加到集合中,值类型对象存储在哪里? 在非generics集合中,它们将被装箱并存储在堆上,generics中有什么不同?