Tag: generics

C#将List 转换为List

我有一个List ,我想将它转换为List 。 有没有办法做到这一点,除了循环List并添加到新的List如下所示: List lstInt = new List(new int[] {1,2,3}); List lstDouble = new List(lstInt.Count);//Either Count or Length, I don’t remember for (int i = 0; i < lstInt.Count; i++) { lstDouble.Add(Convert.ToDouble(lstInt[0])); } 有没有一种奇特的方式来做到这一点? 我正在使用C#4.0,所以答案可能会利用新的语言function。

C#generics方法,在new()构造函数约束中输入参数

有没有办法创建一个使用new()构造函数约束的通用方法来要求具有特定类型的构造函数的类? 例如: 我有以下代码: public T MyGenericMethod(MyClass c) where T : class { if (typeof(T).GetConstructor(new Type[] { typeof(MyClass) }) == null) { throw new ArgumentException(“Invalid class supplied”); } // … } 有可能有这样的东西吗? public T MyGenericMethod(MyClass c) where T : new(MyClass) { // … } 编辑:对此有一个建议 。 请投票,以便我们可以在C#中使用此function!

用于静态generics类?

C#中静态generics类的主要用途是什么? 什么时候应该使用它们? 哪些例子最能说明它们的用法? 例如 public static class Example { public static … } 由于您无法在其中定义扩展方法,因此它们的实用程序似乎有些受限。 关于这个主题的网络参考很少,所以很明显没有很多人使用它们。 这是一对夫妇: – http://ayende.com/Blog/archive/2005/10/05/StaticGenericClass.aspx 静态通用类作为字典 给出的答案摘要 关键问题似乎是“ 静态generics类与静态方法和静态generics成员的非generics静态类之间有什么区别?” 关于使用哪个的决定似乎围绕“类是否需要在内部存储特定于类型的状态?” 如果不需要特定于类型的内部存储,那么具有通用静态方法的静态非generics类似乎更可取,因为调用语法更好,您可以在其中定义扩展方法。

Activator.CreateInstance(string)和Activator.CreateInstance ()的区别

不,这不是关于generics的问题。 我有一个带有内部构造函数的几个类的工厂模式(如果没有通过工厂,我不希望它们被实例化)。 我的问题是CreateInstance失败了“没有为此对象定义的无参数构造函数”错误,除非我在非公共参数上传递“true”。 例 // Fails Activator.CreateInstance(type); // Works Activator.CreateInstance(type, true); 我想让工厂变得通用,使其更简单,如下所示: public class GenericFactory where T : MyAbstractType { public static T GetInstance() { return Activator.CreateInstance(); } } 但是,我无法找到如何传递“true”参数,以接受非公共构造函数(内部)。 我错过了什么或者不可能吗?

实现嵌套通用接口

我有以下类/接口: // Model public class A : IA { } // ModelLogic public class B : IB { } // Model Interface public interface IA { } // ModelLogic Interface public interface IB where T : IA { } 我尝试使用以下代码创建一个新实例: IB foo = new B(); 我收到以下错误: Cannot implicitly convert type ‘B’ to ‘IB’. An explicit […]

C#委托给两个具有不同参数的方法

我使用以下方法: public void M1(Int32 a) { // acquire MyMutex DoSomething(a); // release MyMutex } 和 public void M2(String s, String t) { // acquire MyMutex DoSomethingElse(s, t); // release MyMutex } 从我到目前为止所发现的情况来看,似乎不可能对具有不同签名的两种方法使用单个委托。 有没有其他选择写这样的东西: public void UsingMutex(…) { // acquire MyMutex … // release MyMutex } UsingMutex(M1); UsingMutex(M2); 我现在能想到的只是使用两个委托和一个布尔标志来知道要调用哪个委托,但这不是一个长期的解决方案。 可以将generics与代表结合起来吗? 如果是这样,您是否有任何类型的文档链接? 环境:C#2.0

C# – 获取通用列表的项类型

获取通用列表包含的项类型的最佳方法是什么? 抓取集合中的第一个项目并调用.GetType()很容易,但我不能总是确定集合中会有一个项目。 希望有道理。 谢谢, 桑尼

在C#3.0中是否存在针对“特殊类”Enum的generics类型约束的解决方法?

更新:有关C#解决方法,请参阅此问题的底部。 嗨,您好, 请考虑以下扩展方法: public static bool HasFlags(this T value, T flags) where T : System.Enum { // … } 如您所知,这将在编译时抛出错误,因为通常不允许类从System.Enuminheritance。 问题是使用enum关键字指定的任何枚举实际上都是从System.Enuminheritance的,因此上述代码将是仅将扩展方法限制为枚举的理想方法。 现在明显的解决方法是使用Enum而不是T ,但是你失去了generics类型的好处: MyEnum e; e.HasFlags(MyOtherEnum.DoFunkyStuff); 上面的代码会使用generics类型抛出编译时错误,而它只能使用Enum类型抛出运行时错误(如果我实现它就会这样做。) 是否有任何编译器选项可用于关闭约束检查,还是有其他一些漂亮的方法来做到这一点? 在建议之前,我想说我不会where T : struct或者其他where T : struct使用,从那以后你就可以做到像123.HasFlags(456)这样奇怪的东西。 我很困惑为什么这个错误根本存在…这是你where T : System.Object使用的同样的问题,但为此你有where T : class …为什么没有where T : enum ? C#解决方法 Jon Skeet已经开始研究一个库,该库通过对IEnumConstraint的约束来编译类,然后将其替换为System.Enum后构建。 我相信,这是目前最接近解决这个问题的人。 看到: 代码项目: http : […]

修复通用UserControl的嵌入资源

在重构期间,我向MyControl添加了一个generics类型参数, MyControl是一个派生自UserControl的类。 所以我的class级现在是MyControl 。 现在我在运行时收到一条错误,指出无法找到嵌入式资源文件MyControl`1.resources 。 使用.NET Reflector快速查看显示资源文件实际上名为MyControl.resources ,没有`1 。 在MyControl.InitializeComponent方法的开头,有一行可能是导致问题的那一行: System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager( typeof(MyControl)); 如何强制ComponentResourceManager使用嵌入式资源文件MyControl.resources ? 其他解决此问题的方法也是受欢迎的。

通用约束如何防止使用隐式实现的接口装箱值类型?

我的问题与此问题有些相关: 显式实现的接口和通用约束 。 然而,我的问题是编译器如何启用通用约束来消除对显式实现接口的值类型进行装箱的需要。 我想我的问题归结为两个部分: 在访问显式实现的接口成员时需要将值类型装箱的幕后CLR实现发生了什么,以及 删除此要求的通用约束会发生什么? 一些示例代码: internal struct TestStruct : IEquatable { bool IEquatable.Equals(TestStruct other) { return true; } } internal class TesterClass { // Methods public static bool AreEqual(T arg1, T arg2) where T: IEquatable { return arg1.Equals(arg2); } public static void Run() { TestStruct t1 = new TestStruct(); TestStruct t2 = […]