Tag: generics

使用LINQ for Entity Framework将实体强制转换为通用方法中的已实现接口

我有一个通用的方法来查询EF中TEntity类型的对象。 我想在TEntity实现特定接口的情况下将条件添加为where子句。 我的方法是: public TEntity GetByUserID(Guid userID) { var query = this.DbSet; if (typeof (TEntity).IsImplementationOf()) { query = query .Where((x => !((IDeletableEntity)x).IsDeleted); } return query .FirstOrDefault(x => x.UserID == userID); } IsImplementationOf ()是一个方法,它只是返回true / false,顾名思义。 当我为实现IDeletableEntity的实体地址运行它时,我收到一个错误: 无法将类型“地址”强制转换为“IDeletableEntity”。 LINQ to Entities仅支持转换EDM原语或枚举类型。 任何想法我如何解决这个LINQ的限制?

如果类型在运行时未知,您可以在C#中使用generics方法吗?

解释我的意思的最简单方法是使用代码示例。 这不能编译,但有没有办法实现这个效果: foreach(Type someType in listOfTypes) { SomeMethod(); } 如果可行的话会非常方便,但事实并非如此。 是否有其他方法可以实现与上述相同的内容,为什么C#不允许这是一个法律声明? 编辑:似乎这样做的唯一方法是通过reflection,这可能对我们的需求来说太慢了。 任何洞察为什么没有内置的有效方法,以及这样的事情是否适用于C#4.0?

我可以将类型对象传递给generics方法吗?

我的DataAccessLayer上有一个FindAll方法,如下所示: public FindResult FindAll() where T : Entity, new() 和一个客户端代码有一个Type []数组,它需要用来迭代调用FindAll方法,如下所示: foreach (var type in typeArray) { var result = DataAccessLayer.FindAll(); … 但编译器抱怨“预期的类型或命名空间”..有没有一种简单的方法来解决这个问题? 我尝试过type.GetType()或typeof(type),但都没有用。 提前谢谢了!

C#generics和多态:一个矛盾?

我只是想确认一下我对C#中的Generics的理解。 这已经出现在我使用的几个代码库中,其中使用通用基类来创建类型安全的派生实例。 我正在谈论的一个非常简单的例子, public class SomeClass { public virtual void SomeMethod(){ } } public class DeriveFrom :SomeClass { public override void SomeMethod() { base.SomeMethod(); } } 当我想以多态方式使用派生实例时,问题出现了。 public class ClientCode { public void DoSomethingClienty() { Factory factory = new Factory(); //Doesn’t compile because SomeClass needs a type parameter! SomeClass someInstance = factory.Create(); someInstance.SomeMethod(); } } […]

列出标志枚举中的所有位名称

我正在尝试创建一个帮助方法来列出Enum值中设置的所有位的名称(用于记录目的)。 我想要一个方法,它将返回一些变量中设置的所有枚举值的列表。 在我的例子中 [Flag] Enum HWResponse { None = 0x0, Ready = 0x1, Working = 0x2, Error = 0x80, } 我把它提供给0x81,它应该为我提供一个包含{Ready, Error}的IEnumerable 。 由于我没有找到更简单的方法,我尝试编写下面的代码,但我无法编译。 public static IEnumerable MaskToList(Enum mask) { if (typeof(T).IsSubclassOf(typeof(Enum)) == false) throw new ArgumentException(); List toreturn = new List(100); foreach(T curValueBit in Enum.GetValues(typeof (T)).Cast()) { Enum bit = ((Enum) curValueBit); // Here […]

在C#中是否可以通过以下方式重载通用转换运算符?

只是想知道是否还有代表C#3.5中的以下代码: public struct Foo { public Foo(T item) { this.Item = item; } public T Item { get; set; } public static explicit operator Foo ( Foo a ) where U : T { return new Foo((U)a.Item) } } 谢谢

是否可以创建一个接受(可空)值类型和引用类型的C#generics方法?

我想创建一个接受值类型和引用类型参数的简单方法,即int是value,string是reference。 所以这就是我的开始: public bool areBothNotNull(T? p1, T? p2) { return (p1.HasValue && p2.HasValue); } 所以我希望能够像这样使用它: var r1 = areBothNotNull(3, 4); // will be true var r2 = areBothNotNull(3, null); // will be false var r3 = areBothNotNull(“three”, “four”); // will be true var r4 = areBothNotNull(null, “four”); // will be false 但我遇到的第一个问题是 类型’T’必须是不可为空的值类型,以便在generics类型或方法’System.Nullable’中将其用作参数’T’ 为了继续,我向我的方法添加一个struct约束 public […]

根据子类从基类指定抽象方法的返回类型

我有以下结构: abstract class Base { public abstract List Get(); //What should be the generic type? } class SubOne : Base { public override List Get() { } } class SubTwo : Base { public override List Get() { } } 我想创建一个抽象方法,返回具体子类的任何类。 因此,从示例中可以看出, SubOne的方法应返回List而SubTwo的方法应返回List 。 我在Base类中声明的签名中指定了什么类型? [UPDATE] 谢谢你发布的答案。 解决方案是使抽象类具有通用性,如下所示: abstract class Base { public abstract List […]

C#多个通用约束

我想知道是否可以添加多个通用约束? 我有一个Add方法,它接受一个Object(电子邮件,电话或地址),所以我想的是: public void Add(T Obj) where T : Address where T : Email where T : Phone { if (Obj is Address) m_Address.Add(Obj as Address); else if (Obj is Email) m_Email.Add(Obj as Email); else m_Phone.Add(Obj as Phone); } 但我一直在: “A constraint clause has already been specified for type parameter ‘T’. All of the constraints […]

通用集合中的多态类型参数

为什么C#编译器不允许generics集合中的多态类型(T)参数(即List [T])? 以“A”和“B”为例,其中“B”是“A”的子类 class A { } class B : A { } 并考虑一个带有’A’类型列表的函数 void f(List aL) { } 用“B”类型列表调用 List bL = new List(); f(bL); 给出以下错误 ERROR: cannot convert from List to List 违反了什么语义规则? 除此之外,还有一个“优雅”的意思,除了循环和铸造每个元素(我想要一些糖)? 谢谢。