Tag: generics

C#generics:List 或新类扩展List

我在我的Business对象中有一个名为Product的类,在另一个类中我想返回这个类的对象列表。我应该使用哪种方法? public static List GetProductList() { …. } 或者在名为ProductList的Business对象namspace中创建另一个类,它扩展List ,如下所示: public class ProductList :List { …. } 并在那里使用它 public static ProductList GetProductList() { …. } 这两者有什么区别吗? 内存分配和性能如何?

如何测试两个generics是否具有基本子类关系而不实例化它们?

我有以下generics类: class Base where T : … { … } class Derived : Base where T : … { … } class Another where T : … { … } class DerivedFromDerived : Derived where T : … { … } 在我的代码中的某处,我想测试给定的generics是否inheritance自Base ,而不创建generics的特定实例。 我怎么做? static bool DerivedFromBase(Type type) { /* ??? */ } static void […]

委托Generic Property.GetSetMethod

我正在尝试创建一个委托来设置generics的属性值,但我收到一个错误:当我尝试执行以下代码时Error binding to target method : Action setValue = (Action) Delegate.CreateDelegate( typeof(Action), null, property.GetSetMethod()); 这有可能吗?

在C#中为通用列表的FindAll添加参数

我有一个对象列表,我想用整数参数过滤 List objectList = new List(); // populate objectList with testObjects objectList.FindAll(GroupLevel0); private static bool GroupLevel0(testObject item) { return item._groupLevel == 0; } private class testObject { public string _FieldSQL = null; public int _groupLevel; } 我想要做的是让GroupLevel0接受一个整数作为参数,而不是硬编码为0.我在.NET 2.0中工作,所以lambda表达式是不行的。 甚至可以将参数传递给谓词吗? 谢谢,

当作为具有接口约束的通用参数传递时,值类型是否装箱?

(作为回答这个问题的研究结果,我(我想我有!)确定答案是“不”。但是,我不得不在几个不同的地方找出来解决这个问题,所以我认为还有如果社区投票结束,我不会感到沮丧。) 例如: void f(T val) where T : IComparable { val.CompareTo(null); } void g() { f(4); } 4盒装? 我知道显式地将值类型转换为它实现触发装箱的接口: ((IComparable)4).CompareTo(null); // The Int32 “4” is boxed 我不知道的是,将值类型作为具有接口约束的generics参数传递是否等于执行强制转换 – 语言“其中T是IC可压缩”类型建议转换,但只是将T转换为IComparable似乎它会破坏通用的全部目的! 为了澄清,我想确保在上面的代码中没有发生这些事情: 当g调用f(4) , 4被IComparable为IComparable因为f的参数类型存在IComparable约束。 假设(1)没有发生,在f内, val.CompareTo(null)不会将val从Int32为IComparable以调用CompareTo 。 但我想了解一般情况; 不仅仅是int和IComparable发生了什么。 现在,如果我将以下代码放入LinqPad: void Main() { ((IComparable)4).CompareTo(null); f(4); } void f(T val) where T : IComparable { val.CompareTo(null); } […]

C#generics – 可以用n个generics类型创建一个方法..?

我不认为这是可能的,但是这里…… 我想添加可以处理generics的数字的方法。 例如 : bool MyMethod() where T: Isomething { } 将适用于一种类型 bool MyMethod() where T: Isomething { } 将适用于两种类型 有没有办法处理n种类型 – 例如 bool MyMethod() where T: Isomething { } 我想这样做的原因是实现一个静态的nhibernate辅助方法,它可以从多个程序集加载 – 现在它适用于一个程序集。 我目前的方法如下所示: public static ISessionFactory GetMySqlSessionFactory(string connectionString, bool BuildSchema) { //configuring is meant to be costly so just do it once for each […]

C#通用类型导致歧义

我正在创建一个自定义generics类: class Widget { … public bool Bar( T1 type1 ) { … } public bool Bar( T2 type2 ) { … } … } 当然,以下行会产生一个模糊的调用编译错误: Widget Foo = new Widget(); … Foo.Bar(5); … 有没有办法解决? 是否有一个条款,我可以把它放在“where:TypeOf(T1)!= TypeOf(T2)”,或任何方式使这种歧义? 最好是int,int可用,但它不是manditory。 更新: 对于那些感兴趣的人,我实际上自己为这个问题找到了一个可接受的解决方案(对我来说) class Widget { … public bool Bar( object o ) { if( o.GetType() == typeof(T1) […]

静态初始化inheritance的静态成员

考虑以下示例代码: public class A { public static T TheT { get; set; } } public class B : A { static B() { TheT = “Test”; } } public class Program { public static void Main(String[] args) { Console.WriteLine(B.TheT); } } 这里B.TheT为空。 但是,更改Main方法如下: public static void Main() { new B(); Console.WriteLine(B.TheT); } 正如预期的那样, B.TheT是“测试”。 我可以理解这会强制静态构造函数运行,但为什么第一种情况不会发生这种情况呢? […]

使用Type对象创建generics

我正在尝试使用Type对象创建generics类的实例。 基本上,我会在运行时拥有不同类型的对象集合,因为无法确定知道它们究竟属于哪种类型,我想我将不得不使用Reflection。 我正在做的事情如下: Type elType = Type.GetType(obj); Type genType = typeof(GenericType).MakeGenericType(elType); object obj = Activator.CreateInstance(genType); 哪个好,好。 ^ ___ ^ 问题是,我想访问我的GenericType 实例的方法,我不能这样做,因为它被键入为对象类。 我找不到将obj强制转换为特定的GenericType 的方法,因为这首先是问题(即,我不能放入像:)这样的东西 ((GenericType)obj).MyMethod(); 应该怎样解决这个问题? 非常感谢! ^ ___ ^

如何使用generics来处理需要仔细投射的返回值?

我有一些数据访问层代码调用存储过程并返回各种数据类型的标量值。 语法是ExecuteDecimal,ExecuteString等。我希望它是Execute或Execute 我尝试这个实现,我无法编译,除非我正在使用“(T)值”进行转换,如果我尝试检查类型并调用方法进行转换,没有这样的运气。 更新的问题为什么我必须在转换为T之前转换为对象? 更新的代码 internal T Execute(string storedProcName, Hashtable parameters) { //Next lines do compile (thanks to suggestions from answers!) if (typeof(T) == typeof(string)) return (T) (object) ExecuteScalar(storedProcName, parameters).ToString(); else if (typeof(T) == typeof(int)) return (T)(object) Convert.ToInt32(ExecuteScalar(storedProcName, parameters)); //Next line compiles, but not all things boxed in an object can //be converted straight to […]