Tag: generics

关于索引器和/或generics的问题

如何知道对象是否实现索引器?我需要共享DataRow和IDataReader的逻辑,但它们不共享任何接口。 我也尝试使用generics,但不知道我应该对where子句施加什么限制。 public class Indexer { // myObject should be a DataRow or a IDataReader private object myObject; public object MyObject { get { return myObject; } set { myObject = value; } } // won’t compile, myObject has no indexer public object this[int index] { get { return myObject[index]; } set { myObject[index] = […]

对值类型和引用类型使用C#LINQ表达式

我正在使用MVC for REST,以便我可以利用Razor输出不同类型。 CSV是这些输出之一。 而不是为每种输入类型编写此模板: ID,Created,Content @foreach (var item in Model.TimeData) { @item.ID,@item.Created,”@Html.Raw(item.Content.Replace(“\””, “\”\””))” } 我想利用params和System.Linq.Expressions.Expression写下这样的东西: @{ Html.WriteCsv(Model.TimeData, p => p.ID, p => p.Created, p => p.Content); } 我开始编写一个通用的HtmlHelper并很快意识到我遇到了值类型的问题(memberExpression将为null)。 下面的代码试图写出CSV标题(ID,Created,Content),但它只输出“Content”(因为ID和Created是值类型( int和DateTime )。 public static void WriteCsv(this HtmlHelper htmlHelper, List list, params Expression<Func>[] expressions) { foreach (var expression in expressions) { MemberExpression memberExpression = expression.Body as […]

如何在Dapper中使用generics和Nullable 类型进行实现?

我有这个电话: public IObservable Subscribe(object topic, string service, string connectionString, string query) { try { this.connection.ConnectionString = connectionString; this.connection.Open(); this.connection.Query(query, new { transactionid = topic }).ToObservable().Subscribe(message => this.subject.OnNext(message)); return this.subject; } catch (Exception e) { this.subject.OnError(e); return this.subject; } finally { this.subject.OnCompleted(); this.connection.Close(); } } 这是我的查询: with IDS as (select L1_ID, L2_ID, L1_VALUE, L2_VALUE from MYDB […]

使用Castle Windsor解决具有generics类型约束的接口

给定FooRequest和FooResponse是抽象的接口: public interface IFooHandler where TRequest : FooRequest where TResponse : FooResponse { TResponse CheckFoo(TRequest request); } 实施: public class MyFooHandler : IFooHandler { public MyFooResponse CheckFoo(MyFooRequest request) { /* check for foos */ } } 我如何在温莎城堡注册这个,以便我可以解决它(其中IoCContainer是一个WindsorContainer: Global.IoCContainer.Resolve<IFooHandler>(); 解决MyFooHandler的实例?

将generics类型对象转换为子类型

我的代码中有以下场景: class Document {} class Track : Document {} class ViewListClickHandler { // I can’t change that signature, it’s provided by a library I use. protected override void click(object theList, int index) { // I here need to cast “theList” to IList where T : Document } } 我现在的问题是(正如评论中所写): 如何将theList转换为类似IList where T : Document的类型IList where […]

通常检查null,不会在非约束类型上包含nullables。

假设我有以下方法: public static int CountNonNullMembers(this IEnumerable enumerable) { if (enumerable == null) throw new ArgumentNullException(“enumerable”); int count = 0; foreach (var x in enumerable) { if (x != null) count++; } return count; } 我有这3个arrays:: var ints = Enumerable.Range(0,10).ToArray(); var nullableInts = Array.ConvertAll(ints,x=>x as int?); var strings = Array.ConvertAll(ints,x => x.ToString()); 我写了一个小函数来做一个循环并计算一百万次迭代。 将它应用于ints和strings ,它在我的机器上完成大约100毫秒。 对于nullableInts […]

将混凝土浇筑到通用型?

我正在尝试编译以下代码: public class BaseRequest where TResponse : BaseResponse {} public class BaseResponse {} public class FooRequest : BaseRequest {} public class FooResponse : BaseResponse {} … public TResponse MakeRequest(BaseRequest request) where TResponse : BaseResponse { } 我希望我可以调用MakeRequest(new FooRequest())并将返回值作为FooResponse 。 被调用者不必知道FooRequest并且可以将其传递给另一个处理程序。 签名工作正常,但我无法实现MakeRequest方法。 如果我实现它像: public TResponse MakeRequest(BaseRequest request) where TResponse : BaseResponse { FooRequest fooRequest = request […]

在C#中使用generics约束返回Task 的异步方法

我在我正在研究的项目中实现了一个命令模式。 这几乎是当前的结构: public class Response { public bool Success { get; private set; } public static Response CreateErrorResponse() { return new Response { Success = false }; } } public interface ICommand where T : Response { Task ExecuteAsync(); } public abstract CommandBase : ICommand where T: Response { protected abstract Uri BuildUrl(); protected abstract […]

关于generics,inheritance和链接的棘手问题

对于上下文 – 阅读本文 。 问题: class Program { static void Main() { var b = new bar(); b.buzz().fizz().buzz().fizz(); //cool // ^FAIL!!!…<———————————— Console.ReadLine(); } } public class foo { public foo fizz() { return this; } } public class bar : foo { public bar buzz() { return this; } } 解: class Program { static […]

将类型数组转换为通用数组?

问题的简短版本 – 为什么我不能这样做? 我只限于.NET 3.5。 T[] genericArray; // Obviously T should be float! genericArray = new T[3]{ 1.0f, 2.0f, 0.0f }; // Can’t do this either, why the hell not genericArray = new float[3]{ 1.0f, 2.0f, 0.0f }; 更长的版本 – 我在这里使用Unity引擎,虽然这并不重要。 是什么 – 我试图在其固定的Vector2(2个浮点数)和Vector3(3个浮点数)和我的通用Vector 类之间进行转换。 我无法将类型直接转换为通用数组。 using UnityEngine; public struct Vector { private readonly T[] […]