Articles of generics

C#:接口中的枚举

我已经看到了几个与此问题类似的线索,但它们都没有真正回答我想问的问题。 对于初学者来说,不幸的是我正在使用现有的API代码,所以很遗憾,虽然可能有更好的方法来做我所要求的事情,但是由于向后兼容性不同,我已经被锁定了。 -negotiable。 我有一个响应类,当前包含一个错误代码和字符串描述的枚举。 错误代码定义了一组相当不错且完整的响应,这些响应都非常语义地耦合到使用它们的操作。 不幸的是,我现在必须为一组类似的API对象添加不同的工作流程,这将需要一个字符串描述,这很好,但也是一个包含一组完全不相关的错误代码的枚举错误代码。 错误代码(以及对象模型的其他方面)将在许多相同的类中使用,因此最好让接口运行,以便我可以通过相同的框架运行对象。 这里的目的是签订一份合同,上面写着“我有一个错误代码,以及该错误代码的描述”。 但是,据我所知,没有办法将项目添加到界面,如 public interface IError { enum ErrorCode; string Description; } 也没有办法表达 public interface IError where T: enum { T ErrorCode; string Description; } 每个人都遇到过这样的事情吗?

比较C#中的枚举标志

我需要检测是否在枚举值中设置了一个标志,哪个类型用Flag属性标记。 通常它是这样的: (value & flag) == flag 但是因为我需要通用generics(有时在运行时我的事件只有一个“Enum”引用。我找不到一个简单的方法来使用&运算符。目前我这样做: public static bool IsSet(this T value, T flags) where T : Enum { Type numberType = Enum.GetUnderlyingType(typeof(T)); if (numberType.Equals(typeof(int))) { return BoxUnbox(value, flags, (a, b) => (a & b) == b); } else if (numberType.Equals(typeof(sbyte))) { return BoxUnbox(value, flags, (a, b) => (a & b) == b); […]

如何初始化通用参数类型T?

简单的问题: 如果你有一个string x ,要初始化它,你可以简单地执行以下操作之一: string x = String.Empty; 要么 string x = null; 通用参数T怎么样? 我试过了: void someMethod(T y) { T x = new T(); … } 生成错误: 无法创建变量类型“T”的实例,因为它没有new()约束

可以在此通用代码中避免Delegate.DynamicInvoke吗?

这个问题部分是关于代表,部分是关于generics。 鉴于简化的代码: internal sealed class TypeDispatchProcessor { private readonly Dictionary _actionByType = new Dictionary(); public void RegisterProcedure(Action action) { _actionByType[typeof(T)] = action; } public void ProcessItem(object item) { Delegate action; if (_actionByType.TryGetValue(item.GetType(), out action)) { // Can this call to DynamicInvoke be avoided? action.DynamicInvoke(item); } } } 我在其他地方读到,直接调用委托(带括号)比调用DynamicInvoke快DynamicInvoke数量级,这是有道理的。 对于上面的代码示例,我想知道我是否可以执行类型检查并以某种方式提高性能。 一些上下文:我有一个对象流,可以在各种处理程序中进行处理,这些处理程序可以在运行时注册/取消注册。 上面的模式完全符合我的目的,但如果可能的话,我想让它变得更加快捷。 一种选择是将Action存储在Dictionary ,并使用另一个委托包装Action委托。 我还没有比较第二次间接调用会影响的性能变化。

获取动态对象中方法的generics调用类型

我开始使用.Net中的动态对象,我无法弄清楚如何做某事。 我有一个inheritance自DynamicObject的类,我重写了TryInvokeMember方法。 例如 class MyCustomDynamicClass : DynamicObject { public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { // I want to know here the type of the generic argument } } 在该方法中,我想知道调用中generics参数的类型(如果有的话)。 例如,如果我调用以下代码,我想在动态对象的覆盖方法中获取System.Boolean和System.Int32的值 dynamic myObject = new MyCustomDynamicClass(); myObject.SomeMethod(“arg”); myObject.SomeOtherMethod(“arg”); 目前,如果我在覆盖方法中放置一个断点,我可以得到被调用方法的名称(“SomeMethod”和“SomeOtherMethod”,以及参数的值,但不是generics类型)。 我怎样才能获得这些价值? 谢谢!

IDictionary 与Dictionary

在这里使用IDictionary有什么价值?

如何将可枚举集合附加到C#中的现有列表

我有三个函数返回IEnumerable集合。 现在我想将所有这些组合成一个List。 那么,有什么方法可以将IEnumerable中的项目附加到列表中。 我的意思是没有每个循环?

在C#中,如果我的对象支持该接口,我如何检查T是否为IInterface类型并转换为该类型?

在C#中,我有一个使用generics传入T的函数,我想运行检查以查看T是否是实现interface的object ,如果是,则调用该interface上的methods之一。 我不希望T约束只是那个Type。 是否有可能做到这一点? 例如: public class MyModel : IModel where T : MyObjectBase { public IQueryable GetRecords() { var entities = Repository.Query(); if (typeof(IFilterable).IsAssignableFrom(typeof(T))) { //Filterme is a method that takes in IEnumerable entities = FilterMe(entities)); } return entities; } public IEnumerable FilterMe(IEnumerable linked) where TResult : IFilterable { var dict = GetDict(); return […]

如何在使用通用约束时使用inheritance

在尝试实现允许inheritance并希望有人可以提供帮助的库时,我正在努力解决一些通用约束问题。 我正在尝试建立一个有3种口味的类库,每个库都建立在另一个之上。 对我来说,这似乎是一个使用generics的绝佳机会,因为我不能通过纯粹的inheritance做我想要的事情。 下面的代码(这应该直接粘贴到VS)后面有一些解释: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { #region Base Classes public class GenericElement { } /// Visit to a GenericElement public class Generic_Visit where E : GenericElement { public E Element { get; set; } } /// Collection of Visits public class Generic_Route where V : Generic_Visit […]

inheritanceNon-Generic One C#的通用接口

这是课堂设计问题。 我有主要的抽象类 public abstract class AbstractBlockRule { public long Id{get;set;} public abstract List Restrictions {get;}; } public interface IRestriction{} public interface IRestriction:IRestriction where T:struct { T Limit {get;} } public TimeRestriction:IRestriction { public TimeSpan Limit{get;set;} } public AgeRestriction:IRestriction { public int Limit{get;set;} } public class BlockRule:AbstractBlockRule { public virtual List Restrictions {get;set;} } BlockRule rule=new […]