Tag: generics

在构建将operator ==提升为可空的表达式时,为什么generics和非generics结构的处理方式不同?

这看起来像是在通用结构上提升为操作数的null的错误。 考虑以下伪结构,它覆盖operator== : struct MyStruct { private readonly int _value; public MyStruct(int val) { this._value = val; } public override bool Equals(object obj) { return false; } public override int GetHashCode() { return base.GetHashCode(); } public static bool operator ==(MyStruct a, MyStruct b) { return false; } public static bool operator !=(MyStruct a, MyStruct b) […]

从StackFrame获取Type T.

目标是基于调用my方法的类型创建一个通用实例。 问题是,当从generics调用时,StackFrame似乎只包含开放定义类型参数而不是封闭定义类型参数。 如何从StackFrame获取类型参数? 与此问题类似。 我想我的情况是不同的,因为Log.Debug是从一个封闭的方法调用的。 如果StackFrame不是正确的方法,除IoC以外的任何建议? 此代码用于填写对我的Unity容器的引用不可用的情况。 using System; using System.Reflection; namespace ReflectionTest { public class Logger { private readonly string loggerName; protected Logger(string loggerName) { this.loggerName = loggerName; } public void Debug(string message) { Console.WriteLine(string.Format(“{0} – {1}”, loggerName, message)); } } public class Logger : Logger { public Logger() : base(typeof(T).FullName) { } } […]

为什么铸造给CS0030,而“as”有效?

假设我有一个通用的方法: T Foo(T x) { return x; } 到现在为止还挺好。 但是如果它是Hashtable,我想做一些特别的事情。 (我知道这是一个完全做作的例子Foo()也不是一个非常令人兴奋的方法。一起玩。) if (typeof(T) == typeof(Hashtable)) { var h = ((Hashtable)x); // CS0030: Cannot convert type ‘T’ to ‘System.Collections.Hashtable’ } 该死。 但是,公平地说,我实际上无法判断这是否应该是合法的C#。 那么,如果我尝试以不同的方式做什么呢? if (typeof(T) == typeof(Hashtable)) { var h = x as Hashtable; // works (and no, h isn’t null) } 这有点奇怪。 根据MSDN, expression as […]

“where”在C#类声明中的含义是什么?

我试图谷歌这个,但我能找到的只是普通类声明的文件。 public class DataContextWrapper : IDataContextWrapper where T : DataContext, new() { } 我看到该类实现了IDataContextWrapper,它inheritance自DataContext,并根据它的实例化方式随T类而变化。 我不知道“ where T ”或“ , new() ”可能意味着什么。

委托任何方法类型 – C#

我想要一个将执行任何外部方法的类,如下所示: class CrazyClass { //other stuff public AnyReturnType Execute(AnyKindOfMethod Method, object[] ParametersForMethod) { //more stuff return Method(ParametersForMethod) //or something like that } } 这可能吗? 是否有代理人采用任何方法签名?

通用静态类 – 在运行时检索对象类型

我有一个X类型的对象,我可以(显然)在运行时检索。 var type = myObject.GetType(); 我有一个通用的静态类。 public static class MyStaticClass { public static void DoStuff(T something) { // bla bla } } 我想做的是: MyStaticClass.DoStuff(myObject); 但我不能。 实际上,MyStaticClass只有几种类型可以运行,并且它们共享多个接口。 一种解决方法是写: if (myObject.GetType() == typeof(X)) { MyStaticClass.DoStuff(myObject as X); } if (myObject.GetType() == typeof(Y)) { MyStaticClass.DoStuff(myObject as Y); } 但它很冗长,写到处都是非常丑陋的 – 我觉得我不应该这样做,但我也不应该这样做。 我无法相信没有解决方案。 或者至少有任何整洁的解决方法? 或者我的方法开始时是错误的(如果是这样的替代方案)? 我应该为X,Y,Z创建一些(抽象?)基类吗?

C ++模板和Java / C#generics之间有什么区别?有什么限制?

我从这里读了一篇有趣的文章/主题/讨论,我得到了以下问题: Java / C#generics有哪些局限性? 使用Java / C#generics不可能使用C ++模板有什么可能? 编辑1 Eric Lippert提出的更多推荐问题 使用C#generics可以实现哪些模式但使用C ++模板却无法实现? C#的真正generics类型和Java的类型擦除generics类型有什么区别?

C#,Linq2SQL:创建谓词以查找多个范围内的元素

假设我的数据库中有一个名为Stuff的东西,名为Id。 从用户那里我得到了一系列选定的Range对象(或者我是从输入中创建它们)和他们想要的ID。 该结构的精简版本如下所示: public struct Range : IEquatable<Range>, IEqualityComparer<Range> { public TA; public TB; public Range(T a, T b) { A = a; B = b; } … } 例如,人们可以得到: var selectedRange = new List<Range> { new Range(1, 4), new Range(7,11), }; 然后我想用它来创建一个谓词,只选择那些之间具有值的东西。 例如,使用PredicateBuilder ,我可以这样做: var predicate = PredicateBuilder.False(); foreach (Range r in selectedRange) { […]

generics和可空类型

假设我有一个方法,将int作为字符串,如果解析成功则返回int,否则返回null值。 int? ParseValue(string intAsString) { int i; if (int.TryParse(intAsString, out i)) return i; return null; } 如何重写这个方法,使它不仅可以用于int?,还可以用long ?, decimal? 和日期时间? ?

如何从通用列表中删除项目

我有一个通用列表 如何删除项目? EX: Class Student { private number; public Number { get( return number;) set( number = value;) } private name; public Name { get( return name;) set( name = value;) } main() { static List = new list(); list.remove…??? } }