Tag: generics

如何在运行时动态创建Action ?

我希望能够在运行时执行以下等效操作: var action = new Action(obj => Console.WriteLine(“Called = ” + obj)); 我知道我需要为Action获取正确的类型,但不知道如何使用Delegate.Create获取最后一位。 在Action定义中Type表示T. var actionType = typeof(Action).MakeGenericType(Type); var constructor = actionType.GetConstructors()[0]; var @delegate = Delegate.CreateDelegate(actionType, ); 人们似乎缺少的一点是我正在尝试创建一个Action实例,其中T不能静态指定,因为它是从一个派生自Attribute的类中使用的 – 这意味着T可以是任何东西而且它不能被定义为通用定义 干杯

Action 参数的通用方法

所以,我确信之前已在某处回答过,但我无法在任何地方找到它。 希望一些仿制药大师可以提供帮助。 public interface IAnimal{} public class Orangutan:IAnimal{} public void ValidateUsing(Action action) where T : IAnimal { Orangutan orangutan = new Orangutan(); action(orangutan); //Compile error 1 //This doesn’t work either: IAnimal animal = new Orangutan(); action(animal); //Compile error 2 } 参数类型’T’不能赋予参数类型’Orangutan’ 参数类型’IAnimal’不能分配给参数类型’T’ 编辑:基于Yuriy和其他人的建议 ,我可以做一些演员,如: public void ValidateUsing(Action action) where T : IAnimal { Orangutan orangutan […]

通用方法可以使用逆变/协变类型吗?

我正在编写一个通用的方法,在T4模板的特殊任务中使用它。 该方法应该允许我使用通用接口中的专用类型。 我想到了以下签名: interface IGreatInterface { Object aMethodAlpha(U parameter) where U : IAnInterface; Object aMethodBeta(IAnInterface parameter) } public class AnInterestingClass : IAnInterface{} 当我尝试实现IGreatInterface ,编译器为aMethodBeta()标记了一个错误,因为我已经让我的T4使用IAnInterface的子类型来编写该方法(即我想实现这样的方法: Object aMethodBeta(AnInterestingClass parameter) )。 方法aMethodAlpha()可以使用,但不是我想要的干净,因为我的T4必须生成一些额外的代码。 我(也许错误地)提出必须由T4完成该方法的实现 Object aMethodAlpha(AnInterestingClass parameter) 。 我认为generics方法不支持逆变类型,但我不确定; 我想这是编译器阻止编码器使用具有未在通用类型中定义的方法的特定类型的方式… 通用方法在实现时是否必须使用确切类型? 有什么技巧可以改变这种行为吗?

从通用List 中删除项目

我有以下方法,我希望从我的集合中删除与产品ID匹配的项目。 似乎相当直接,但我得到一个例外。 基本上我的collections是不同步的。 那么从集合中删除项目的最佳方法是什么? public void RemoveOrderItem(Model.Order currentOrder, int productId) { foreach (var orderItem in currentOrder.OrderItems) { if (orderItem.Product.Id == productId) { currentOrder.OrderItems.Remove(orderItem); } } } exception详细信息:System.InvalidOperationException:集合已修改; 枚举操作可能无法执行

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有什么价值?