Tag: generics

C#中的Typesafe即发即弃异步委托调用

我最近发现自己需要一种类型安全的“即发即忘”机制来异步运行代码。 理想情况下,我想要做的是: var myAction = (Action)(() => Console.WriteLine(“yada yada”)); myAction.FireAndForget(); // async invocation 不幸的是,在没有相应的EndInvoke() BeginInvoke()情况下调用BeginInvoke()的明显选择不起作用 – 它导致资源泄漏缓慢(因为asyn状态由运行时保持并且从未释放…它期望最终调用EndInvoke() 。我也无法在.NET线程池上运行代码,因为它可能需要很长时间才能完成(建议只在线程池上运行相对短暂的代码) – 这使得它无法使用ThreadPool.QueueUserWorkItem() 。 最初,我只对签名与Action , Action或Func匹配的方法只需要此行为。 所以我把一组扩展方法(见下面的清单)放在一起,让我这样做而不会遇到资源泄漏。 每个版本的Action / Func都有重载。 不幸的是,我现在想将此代码移植到.NET 4,其中Action和Func上的generics参数的数量已大幅增加。 在我编写T4脚本来生成这些之前,我还希望找到一种更简单,更优雅的方法来实现这一点。 欢迎任何想法。 public static class AsyncExt { public static void FireAndForget( this Action action ) { action.BeginInvoke(OnActionCompleted, action); } public static void FireAndForget( this Action […]

如何在C#中将IEnumerable 转换为List ?

我使用LINQ查询generics字典,然后使用结果作为我的ListView(WebForms)的数据源。 简化代码: Dictionary dict = GetAllRecords(); myListView.DataSource = dict.Values.Where(rec => rec.Name == “foo”); myListView.DataBind(); 我认为这会工作,但实际上它会抛出System.InvalidOperationException : ID为’myListView’的ListView必须具有实现ICollection的数据源,或者如果AllowPaging为true,则可以执行数据源分页。 为了使它工作,我不得不采取以下措施: Dictionary dict = GetAllRecords(); List searchResults = new List(); var matches = dict.Values.Where(rec => rec.Name == “foo”); foreach (Record rec in matches) searchResults.Add(rec); myListView.DataSource = searchResults; myListView.DataBind(); 在第一个例子中是否有一个小问题让它工作? (不知道该使用什么作为这个问题标题,随意编辑更合适的东西)

将List 转换为object

我正在寻找一个将List转换为object[]单行程序。 这是一个class轮,所以我对foreach等解决方案不感兴趣,或者for … 任何接受者? 提示:不, List.ToArray()和List.ToArray()都不起作用。 编辑:为什么List.ToArray()不起作用? 因为它无法编译。

自反型参数约束:X 其中T:X – 任何更简单的替代方案?

我经常通过向其添加自引用(“反身”)类型参数约束来使简单的界面更复杂。 例如,我可能会这样做: interface ICloneable { ICloneable Clone(); } class Sheep : ICloneable { ICloneable Clone() { … } } //^^^^^^^^^^ Sheep dolly = new Sheep().Clone() as Sheep; //^^^^^^^^ 成: interface ICloneable where TImpl : ICloneable { TImpl Clone(); } class Sheep : ICloneable { Sheep Clone() { … } } //^^^^^ Sheep dolly = new […]

使用Autofac注册通用类型

我有UnitofWork类,它实现了IUnitOfWork。 我试着用autofac注册: var builder = new ContainerBuilder(); builder .RegisterGeneric(typeof(UnitOfWork<Repository,>)) .As(typeof(IUnitOfWork)) .InstancePerDependency(); 实施是: public class UnitOfWork : IUnitOfWork where T : Repository where O : BaseEntity { } public interface IUnitOfWork : IDisposable { void SaveChanges(); } 给出“预期类型”错误 但是这个工作在另一个项目上: public class Repository : GenericRepository where T : BaseEntity { public Repository(IDbContext context) : base(context) { } […]

在没有指定T的情况下模拟Moq中的generics方法

我有一个方法的接口如下: public interface IRepo { IA Reserve(); } 我想模拟包含此方法的类,而不必为它可用于的每种类型指定安装方法。 理想情况下,我只是希望它返回一个new mock.Object 。 我该如何实现这一目标? 看来我的解释还不清楚。 这是一个例子 – 当我指定T(这里是字符串)时,这是可能的: [TestMethod] public void ExampleTest() { var mock = new Mock(); mock.Setup(pa => pa.Reserve()).Returns(new Mock<IA>().Object); } 我想要实现的是这样的: [TestMethod] public void ExampleTest() { var mock = new Mock(); mock.Setup(pa => pa.Reserve()).Returns(new Mock<IA>().Object); // of course T doesn’t exist here. But […]

通过动态引用访问嵌套类的成员时发生StackOverflowException

我已经定义了一个派生自BindingList的generics类,并且有一个嵌套的非generics类: class Generic : BindingList<Generic.Inner> { public class Inner { public object Foo { get; set; } } } 尝试通过动态引用访问Value属性时,mscorlib中发生StackOverflowException ,如下所示: dynamic d = new Generic.Inner(); var value = d.Foo; // StackOverflowException var value = d.Bar // StackOverflowException as well, not a // ‘RuntimeBinderException’ like you would expect when // trying to access a non-existing […]

通用约束和接口实现/inheritance

不完全确定如何表达这个问题,因为它是“为什么这不起作用?” 查询类型。 我已将我的特定问题减少到此代码: public interface IFoo { } public class Foo : IFoo { } public class Bar where T : IFoo { public Bar(T t) { } public Bar() : this(new Foo()) // cannot convert from ‘Foo’ to ‘T’ { } } 现在, Bar类中的generics类型T 必须实现IFoo。 那么为什么编译器会在评论中给出错误? 当然,Foo的一个实例是IFoo,因此可以作为generics类型T的代表传递? 这是编译器限制还是我遗漏了什么?

“在大多数情况下,基础抽象通用类是一个糟糕的选择。”为什么? (或者为什么不)

我刚看到博客文章的评论: 在大多数情况下,基本抽象generics类是一个糟糕的选择 这是真的,如果不是为什么? 有什么见解导致这种说法?

获取类实现的generics接口的类型参数

我有一个通用接口,比如IGeneric。 对于给定的类型,我想找到一个类通过IGeneric实现的generics参数。 在这个例子中更清楚: Class MyClass : IGeneric, IGeneric, IDontWantThis { … } Type t = typeof(MyClass); Type[] typeArgs = GetTypeArgsOfInterfacesOf(t); // At this point, typeArgs must be equal to { typeof(Employee), typeof(Company) } GetTypeArgsOfInterfacesOf(Type t)的实现是什么? 注意:可以假设GetTypeArgsOfInterfacesOf方法是专门为IGeneric编写的。 编辑:请注意我特别询问如何从MyClass实现的所有接口中过滤掉IGeneric接口。 相关: 确定类型是否实现了通用接口