Tag: generics

使用约束来解决缺少部分generics类型推断的问题

我有一个具有此成员的接口(由存储库使用): T FindById(TId id) where T : class, IEntity where TId : IEquatable; 这允许调用者指定实体类型( T )及其Id字段( TId )的类型。 然后,此接口的实现者将找到类型为T的实体,并使用id参数根据其id(在IEntity上定义)对其进行过滤。 目前我称之为: int id = 123; var myApproval = PartsDC.FindById(id); 理想情况下我想这样做: int id = 123; var myApproval = PartsDC.FindById(id); 我已经阅读了这个问题的答案: C#中可能的部分generics类型推断? 我知道我无法获得我想要的语法,但可以接近。 由于我的通用参数约束,我无法在我的情况下完全设置它。 这是我到目前为止所拥有的: public class FindIdWrapper where T : class { public readonly IDataContext InvokeOn; public […]

为什么通用类型定义实现的接口会丢失类型信息?

例如,如果您运行以下代码… Type IListType = new List().GetType() .GetInterface(“IList`1”) .GetGenericTypeDefinition(); …并且您观察IListType变量,您会发现整个Type实例具有FullName等所有可用属性。 但是当你运行代码时会发生什么? Type IListType2 = typeof(List).GetInterface(“IList`1”) 现在,来自generics类型定义的IListType与第一个代码示例不同:大多数Type属性将返回null。 这个问题的主要问题是IListType == IListType2不等于它们是相同的类型。 这是怎么回事? 这太丑了…… 现在看看如果调用IListType2.GetGenericTypeDefinition()会发生什么……它恢复了类型信息! .NET Framework开发团队成员可以解释为什么一个奇怪地丢失其元数据的已经generics的类型定义为什么IsGenericTypeDefinition属性设置为false而它仍然是generics类型定义,最后,如果你调用GetGenericTypeDefinition()在它上面,你恢复了类型信息。 这很奇怪… 以下等式将true : Type IListType = new List().GetType() .GetInterface(“IList`1”) .GetGenericTypeDefinition(); // Got interface is “like a generic type definition” since it has // no type for T generic parameter, and once you […]

使用策略模式在C#上实现多参数C ++模板行为

我正在尝试使用C#generics和基于此答案的策略模式实现类似c ++的模板 这是模式的一个示例: interface ISomePolicy { void _doSomething(U u); } class MyClass: ISomePolicy, ISomePolicy { internal T myElement {get;set;} public MyClass(T Element) { myElement = Element; } void ISomePolicy._doSomething(double u) { Console.WriteLine(“this is int, double”); } void ISomePolicy._doSomething(int u) { Console.WriteLine(“this is int, int”); } } static class MyClassExtension { //What I want to do […]

C#:通用方法不调用特定方法重载

我试图在C#中创建一个generics方法,它将根据其主体中的参数数据类型调用不同的方法,然后处理它们的结果。 我试图通过创建一个通用的包装器方法来实现这一点,然后提供处理方法的几个重载 – 包括一个通用的,如果没有特定的重载可用。 当我直接调用处理方法时,正确选择了适当的版本。 但是当我从包装器方法调用它时,它总是选择generics方法,即使我传递给它的特定数据类型存在匹配的重载。 有没有办法调整代码使其行为符合我的需要? 或者我必须使用不同的方法。 我需要代码与Mono 2.6兼容。 using System; class Program { static void Func(T val) { Console.WriteLine(“Generic Func”); } static void Func(int val) { Console.WriteLine(“Int Func”); } static void Func(string val) { Console.WriteLine(“String Func”); } static void FuncWrap(T val) { Console.Write(“Wrap: “); Func(val); } static void Main(string[] args) { Func(2); Func(“Potato”); […]

C#generics命名约定来自哪里?

我知道T来自Type ,但为什么经常使用的下一个变量是K ?

如何获取委托调用的结果列表?

我需要更多地了解委托和C#语言设计。 假设我有一个MulticastDelegate ,它实现了通用委托,并包含多个调用: Func func = null; func += ( )=> return 8; func += () => return 16; func += () => return 32; 现在这段代码将返回32: int x = func(); // x=32 我想知道是否存在(或者更好,我应该问为什么它不存在!)使用C#语言特性可以访问所有委托调用的结果,这意味着获取列表({8 ,16,32})? 当然,使用.NET框架例程也可以这样做。 这样的事情会做的工作: public static List InvokeToList(this Func func) { var returnValue = new List(); if (func != null) { var invocations […]

GetOriginalTypeParameterType throws未将对象引用设置为对象exception的实例

参考: 动态如何用作通用? public void CheckEntity(int entityId, string entityType = null) { dynamic AnyObject = Activator.CreateInstance(“Assembly”,”Assembly.Models.DbModels.” + entityType).Unwrap(); CheckWithInference(AnyObject, entityId); } private static void CheckWithInference(T ignored, int entityId) where T : class { Check(entityId); } private static void Check(int entityId) where T : class { using (var gr = new GenericRepository()) { } } 这与CheckEntity(16,”Container”);一起进入CheckEntity(16,”Container”); 。 […]

什么时候应该封装generics类型?

我见过很多人建议你应该用类更接近你的域封装generics类型,例如Steve和Nat在增长面向对象软件中的建议,在测试的指导下 : 我们的经验法则是我们试图用generics来限制传递类型[…]。 特别是当应用于集合时,我们将其视为一种复制forms。 这是一个暗示,应该将一个域概念提取到一个类型中。 一般来说,什么时候做这样的事情是个好主意.. class PersonList : List ..而不是直接使用List ?

C#:是否可以返回IOrderedEnumerable ?

是否可以在IEnumerable上不使用OrderBy或OrderByDescending方法从方法返回IOrderedEnumerable IEnumerable ? 我猜也许不是……但……也许我错了? 理由:主要是好奇心。 在回答一个数字中的数字时, 这对我有点打击。 并且我的方法将按照给定数字中的权重按升序返回数字。 所以我认为如果它们以框架能够识别为有序的方式排序出来可能会很好。 当然,我们可以争辩说,从共同的数字观点来看,它们并没有被命令。 但是,如果他们应该或不应该在这里不是重点。 只要它有可能。 如果IOrderedEnumerable不仅仅是具有不同名称的IEnumerable ,我想我也有点暗示一个问题(或者现在至少)。 它还包含更多内容吗? 我知道它有ThenBy和ThenByDescending方法,但它们是否使用IOrderedEnumerable任何内容,或者它只是在IEnumerable上直接使用它们没有意义?

比较两个类型为T的System.Enum

我现在非常接近了解Generics(我认为)。 但是,只是认为System.Enum不容易实现为generics类型。 我有这堂课: public class Button where TEnum : struct, IConvertible, IComparable, IFormattable { public TEnum Identifier { get; private set; //Set in the ctor } } 和 public abstract class AbstractInputDevice where TEnum : struct, IConvertible, IComparable, IFormattable { private List<Button> _buttons = new List<Button>(); public Button GetButton(TEnum Identifier){ foreach(Button button in _buttons){ if(button.Identifier […]