Tag: generics

为什么C#不对generics做“简单”类推理?

只是好奇:当然,我们都知道generics类型推断的一般情况是不可判定的。 所以C#根本不做任何类型的子类型:如果Foo 是generics的, Foo 不是Foo 的子类型,或Foo 或其他任何你可能的类型做饭。 当然,我们都用丑陋的界面或抽象的类定义来解决这个问题。 但是……如果你不能解决一般问题,为什么不把解决方案限制在容易的情况下。 例如,在上面的列表中,显然Foo 是Foo 的子类型,并且检查它是微不足道的。 对于Foo 进行检查也是如此。 如果他们只是说,那么还有其他一些深深的恐怖会从深渊蔓延出来,我们会尽我们所能吗? 或者这只是微软语言人员的某种宗教纯洁? 更新: 这是一个非常古老的线程。 这些天,C#有var,它解决了我抱怨的一半,然后使用Linq风格的匿名代表,有一个很好的表示法,不需要输入相同的东西两次。 因此,我反对的所有方面都已经通过最近对C#的更改得到了解决(或者我只是花了一些时间来了解我刚发布post时刚刚介绍的内容……)我使用这些新内容现在在Isis2系统中可靠的云计算function(isis2.codeplex.com),我认为该库具有非常干净的外观和感觉。 看看它,让我知道你的想法)。 – Ken Birman(2014年7月)

IList 和List 与接口的转换

我一般都了解接口,inheritance和多态,但有一件事令我困惑。 在这个例子中, Cat实现了IAnimal ,当然List实现了IList : IList cats = new List(); 但它会生成编译错误(无法隐式转换类型…) 。 如果我使用Catinheritance的asbtract超类[Animal],它也将无法工作。 但是,如果我用Cat替换IAnimal : IList cats = new List(); 它编译得很好。 在我看来,因为Cat实现了IAnimal ,所以第一个例子应该是可接受的,允许我们返回列表和包含类型的接口。 谁能解释为什么它无效? 我确信这是一个合乎逻辑的解释。

entity framework动态Where子句

我有一个查询: var function = GetSomeExpression(); using (FooModel context = new FooModel()) { var bar = context.Bar.Where(function); } 我想创建一个generics方法,可以在上下文中针对不同的实体执行Where。 目标不是必须做context.Bar.Where,context.Car.Where,Context.Far.Where等。 一些无法完成的事情,但说明了目标是: var q = context.GetObjectContext(T).Where(queryFunction); 我已经研究过使用Relfection并且可以获取Where方法,但是不知道如何针对在委托中传递的上下文执行它。 我也看过DynamicMethod,但做整个IL事情并不喜欢吸引人。 到目前为止我所拥有的: private List GetResults(Expression<Func> queryFunction) { // note: first() is for prototype, should compare param type MethodInfo whereMethod = typeof(Queryable).GetMethods() .Where(m => m.Name == “Where”) .First().MakeGenericMethod(typeof(T)); // invoke the […]

我可以限制通用堆栈的深度吗?

是否有内置的方法来限制System.Collection.Generics.Stack的深度? 因此,如果您处于最大容量,推送新元素将删除堆栈的底部? 我知道我可以通过转换为数组并重建堆栈来实现它,但我想可能已经有了一个方法。 编辑:我写了一个扩展方法: public static void Trim (this Stack stack, int trimCount) { if (stack.Count <= trimCount) return; stack = new Stack ( stack .ToArray() .Take(trimCount) ); } 因此,它在修剪时返回一个新的堆栈,但不是不可变的function方式=) 这样做的原因是我在堆栈中存储应用程序的撤消步骤,我只想存储有限数量的步骤。

带有通用代码隐藏的WPF UserControl

我有这个代码: CustomUserControl.xaml.cs namespace MyProject { public partial class CustomUserControl : UserControl { … } } 而这个xaml: CustomUserControl.xaml 它不起作用,因为x:Class =“MyProject.CustomUserControl”与代码隐藏的generics类定义不匹配。 有没有办法让这项工作?

从Generics 转换为特定子类

我有一个class级 public class MyClass where T : OneType { T MyObj { get; set; } public MyCLass(T obj) { } } public class SubClass: MyClass { } // snip for other similar class definition 其中, TwoType派生自OneType 。 现在,我有这个实用方法 public static MyClass Factory(T vd) where T : OneType { switch(vd.TypeName) { case Constant.TwoType return new SubClass((TwoType)vd); […]

C#lambda查询使用generics类型

我有三个class,他们都有财产日期。 我想写一个generics类来返回一个日期的所有记录。 现在的问题是:如何使用generics类型T编写lambda表达式? 代码简单如下(我不会编译,因为“r.Date”不起作用,但它是我想要实现的效果) Class GenericService: IGenericService where T:class { … readonly IGenericRepository _genericRepository; public IEnumerable GetRecordList(DateTime date) { var query=_genericRepository.FindBy(r=>r.Date=date); } 谢谢你的帮助! 此致,Léona

C#通用方法返回值

我只是在学习generics并且对方法返回值有疑问。 说,我想要一个generics方法,因为方法签名所需的通用部分只是返回值。 该方法将始终采用一个字符串作为其参数,但可以返回double或int。 这可能吗? 实际上我想要一个字符串,解析其中包含的数字(可以是double或int),然后返回该值。 谢谢。

如何将动态用作通用?

如何将动态作为通用使用? 这个 var x = something not strongly typed; callFunction(); 还有这个 dynamic x = something not strongly typed; callFunction(); 都产生这个错误 Error 1 The type or namespace name ‘x’ could not be found (are you missing a using directive or an assembly reference?) 我该怎么做才能使它足够合法用于 ?

generics与inheritance(当不涉及集合类时)

这是这个问题的延伸,可能甚至可能是其他一些问题的重复(如果是这样,请原谅我)。 我在MSDN上看到generics通常与集合一起使用 generics类的最常见用途是使用链接列表,散列表,堆栈,队列,树等集合,其中诸如添加和删除集合中的项的操作以大致相同的方式执行,而不管数据类型是什么存储。 我看到的例子也validation了上述陈述。 有人可以在不涉及任何集合的现实场景中有效地使用generics吗? 小心翼翼地,我正在考虑制作一个不涉及collections的例子 public class Animal { public void Speak() { Console.WriteLine(“I am an Animal and my type is ” + typeof(T).ToString()); } public void Eat() { //Eat food } } public class Dog { public void WhoAmI() { Console.WriteLine(this.GetType().ToString()); } } 和“狗的动物”将是 Animal magic = new Animal(); 完全有可能让Dog从Animalinheritance(假设Animal的非通用版本) Dog:Animal因此Dog 是 Animal […]