Tag: generics

将公共属性约束到List 中的特定类型

我的原始问题与特定类型的Constrain类型基本相同。 我想要完成的基本上就是这个。 public List MyPublicProperty { get; set; } where T IMyCustomInterface 现在阅读上面的问题我可以看出它显然是不可能的。 为了让您了解上下文,我正在构建一个旨在支持多种类型的解析器(假设它们实现了特定的接口),但我没有对它可能解析的数据类型进行编译类型假设。 它只是提供一个受支持的类型列表,应该能够自动计算其余的类型。 基本上我想知道的是,对于这样的属性(如果存在的话),除了运行时类型检查时(除了运行时类型检查时)是什么? 编辑:建议的解决方案似乎不起作用。 我最终得到的代码如下: public class CustomSerializableTypeList : List where T : ITcpSerializable { } CustomSerializableTypeList myCustomTypes = new CustomSerializableTypeList(); 并收到以下错误: 类型’System.Type’不能在generics类型或方法’CustomSerializableTypeList’中用作类型参数’T’。 没有从’System.Type’到’ITcpSerializable’的隐式引用转换。 一旦我查看并考虑已建议的generics实现,该错误就非常有意义。 必须有办法解决这个问题。

为什么Type.IsGenericType为Task返回TRUE而没有通过方法reflection获得的返回类型但是typeof(Task).IsGenericTyp返回FALSE

有人可以解释一下吗? 每个文档IsGenericType 指示当前Type是否表示generics类型或方法的定义中的类型参数。 所以这个(LINQPad)代码: bool bStraight = typeof(Task).IsGenericType; bStraight.Dump(“typeof(Task).IsGenericType”); 按预期工作并产生输出: 的typeof(任务).IsGenericType 假 但是当我通过reflection从方法中检索它时: public class MyClass { public async Task Method() { await Task.Run(() => { Thread.Sleep(3000); }); } } public async Task TEST() { MyClass theObject = new MyClass(); Task task = (Task)typeof(MyClass).GetTypeInfo() .GetDeclaredMethod(“Method”) .Invoke(theObject, null); bool b = task.GetType().IsGenericType; bool b2 = task.GetType().GetGenericTypeDefinition() […]

如果没有`typedef`,如何在c#generics中创建相关类型的组?

作为一个来自C ++背景的人,我遇到了以下情况: 鉴于c#不支持typedef,您如何以编程方式关联类型。 也就是说,在C ++中,我可以将相关类型存储为typedef,以便在与模板一起使用时进行检索。 由于缺少typedef ,同样的方法无法以相同的方式在c#中完成。 例如在C ++中我会: template class Thing : public ThingBase { public: bool isRelated( T::Parent & otherThing ) { T::Auxillary aux( “Yes” ); return aux.isValid( otherThing ) && data.isParent( otherThing ); } private: T data; }; 这适用于以下任何一种情况: class SomeClass { public: typedef SomeClassParent Parent; typedef FooAuxillary Auxillary; bool isParent( Parent […]

如何使用C#任务并行库和IProducerConsumerCollection实现通用回调?

我有一个组件向基于Web的API提交请求,但必须限制这些请求,以免违反API的数据限制。 这意味着所有请求必须通过队列来控制它们的提交速率,但它们可以(并且应该)同时执行以实现最大吞吐量。 每个请求必须在完成后的某个时刻将某些数据返回给调用代码。 我正在努力创建一个很好的模型来处理数据的返回。 使用BlockingCollection我不能只从Schedule方法返回Task ,因为入队和出队进程位于缓冲区的两端。 因此,我创建了一个RequestItem类型,其中包含Action<Task>forms的回调。 这个想法是,一旦一个项目被从队列中拉出,就可以用启动的任务调用回调,但是我已经丢失了那个点的generics类型参数,而且我还在使用reflection和各种恶作剧(如果它是甚至可能)。 例如: public class RequestScheduler { private readonly BlockingCollection _queue = new BlockingCollection(); public RequestScheduler() { this.Start(); } // This can’t return Task, so returns void. // Instead RequestItem is generic but this poses problems when adding to the queue public void Schedule(RequestItem request) { _queue.Add(request); } private […]

Autofac使用开放式通用类解析开放式通用接口

所以我有一个接口和类: public interface IMyInterface where T : ISomeEntity {} public class MyClass : IMyInterface where T : ISomeEntity {} 我会有一些课程要求它: public class SomeClass : ISomeClass { public SomeClass (IMyInterface myInterface) {} } 我已经做了各种各样的事情来让它注册开放的通用接口和类没有运气。 我只想说: container.RegisterType(typeof(MyClass)).As(typeof(IMyInterface)); 如果我必须经历并明确地执行以下操作,那将是令人讨厌的: container.RegisterType<MyClass>().As<IMyInterface>(); 这不应该是微不足道的吗?

如何将“Dictionary ”作为Dictionary “传递?

C#和Stackoverflow都是新手……请随时注明是否应该以不同的方式或其他地方提出要求。 鉴于: public interface IPoint {…} public struct DeliveryPoint : IPoint {…} 和生成具有大量交付点的字典的代码: … Dictionary dict = new Dictionary(); … 现在需要将这些点传递给需要接口类型的例程: public void doSomething( Dictionary dict ) { …} 以为我能做的事情如下: doSomething( dict ); 我发现的唯一解决方案是创建一个新的List并复制所有的点,这些点似乎首先破坏了实现接口的整个目的。 有更好的方法吗?

AutoMapping自定义通用类型 – 如何?

嘿伙计们,我正在使用automapper版本1.1.0.188 在我的AutoMapper.Configure中,我将实体映射到DTO,反之亦然,如下所示: // entity >> DTO Mapper.CreateMap(); Mapper.CreateMap(); // DTO >> Entity Mapper.CreateMap(); Mapper.CreateMap(); 当我做下面的映射(反之亦然)时,一切正常 Mapper.Map(entity); Mapper.Map<List, List>(entities); 请注意,automapper只能与List 一起使用,而无需配置任何内容。 我有一个Generic Container(本例简化): public class Container { public int TotalItems{get;set;} public IList Items{get;set;} } 现在,当我这样做时,没有任何额外的自动配置: Mapper.Map<Container, Container>(entityContainer); 我得到一个automapperexception: 缺少类型映射配置或不支持的mapping.Exception 但是,如果我在特定类型的自动配置中添加此行,如下所示,则Container映射有效。 Mapper.CreateMap<Container, Container>(); 但是,它只适用于Person / PersonDTO类型。 为什么是这样? 如何让automapper识别Container类,因为它识别List ?? 我不想为每种类型的AGAIN显式配置映射。 很酷,干杯

为什么类型推断和隐式运算符在以下情况下不起作用?

我将试着用一个例子来解释我的问题: class V { public readonly Func Get; public readonly bool IsConstant; V(Func get, bool isConstant) { Get = get; IsConstant = isConstant; } public static implicit operator V(T value) { return new V(() => value, true); } public static implicit operator V(Func getter) { return new V(getter, false); } } void DoSomething(V v) { […]

使用带有String的Subsonic.Select()ExecuteTypedList方法

这是一个关于generics而不是亚音速的问题: 想象一下,如果有以下代码: List result = DB.Select(Product.Columns.Id) .From() .ExecuteTypedList(); 这很好用,并返回一个包含我的Product表中的ID的通用列表。 但是,如果我想获得ProductName的列表: List result = DB.Select(Product.Columns.ProductName) .From() .ExecuteTypedList(); 它会抛出编译器消息(翻译自德语): “string”必须是非抽象类型,具有不带参数的公共构造函数,以便用作generics类型或在generics方法“SubSonic.SqlQuery.ExecuteTypedList()”中用作参数“T”。 cause:String没有空的构造函数: int i = new int; // works String s = new String; // compiler error: “string” does not contain a constructor that takes ‘0’ argument 如果我使用List而不是它有效 ,但是有更优雅的方式,我可以使用List吗? 更新: List不起作用。 我确实得到了一个对象列表,但这似乎是“空”对象,不包含我的ProductNames(object.ToString()返回{Object} )

关于generics类的Unity 2.0 IOC配置

我想要一些Repository类扩展一个常见的generics类来执行一些常见的操作,问题是:如何在配置文件中配置UserExRepository类型 。 public class UserExRepository : Repository, IUserEx { public UserExRepository(Context context):base(context){ } } public abstract class Repository : IRepository where TObject : class { protected Context Context = null; public Repository(Context context) { Context = context; } // do some common operation about entity, like create, delete… }