Tag: generics

如何使用reflection找到特定的generics过载?

我正在尝试创建一个将调用特定generics重载方法的Expression (在我的第一个测试用例中为Enumerable.Average )。 特定类型绑定直到运行时才知道,因此我需要使用Reflection来查找和创建正确的generics方法( Expression是从解析后的文本创建的)。 所以,如果我在运行时知道我想找到这个特定的重载: public static double Average(this IEnumerable source, Func selector) 如何使用reflection解析特定的MethodInfo ? 到目前为止,我有以下选择声明: MethodInfo GetMethod(Type argType, Type returnType) { var methods = from method in typeof(Enumerable).GetMethods(BindingFlags.Public | BindingFlags.Static) where method.Name == “Average” && method.ContainsGenericParameters && method.GetParameters().Length == 2 && // and some condition where method.GetParameters()[1] is a Func that returns type […]

字典与不同类型的代理:清除,非字符串方法名称?

必须有一个更清洁的方法。 目前我有: … Constructor() { parseDictionary = new Dictionary() { {typeOfStream.SOME_ENUM_VAL, Delegate.CreateDelegate(typeof(ParseDelegate), this, “MyMethod”)}, {typeOfStream.SOME_OTHER_ENUM_VAL, Delegate.CreateDelegate(typeof(ParseDelegate), this, “MyOtherMethod”)} }; } public bool MyMethod(string some_string) { … } public bool MyOtherMethod(XmlNode some_node) { … } 我想摆脱“MyMethod”和MyOtherMethod并将它变成这个.MyMethod和this.MyOtherMethod 。 选项? 我对任何允许我使用Dictionary查找的解决方案持开放态度,并将我的数据mojo指向任意方法(以及具有任意一组参数的已定义方法)以进行解析。

C#通过定义基类

我试图找到一种从generics基类派生类的方法。 说: sealed public class Final : Base{ } public class Base : T where T : Anything { //<- Generics do not allow this } 在C#中,这似乎不可能。 有没有其他解决方案来实现类似的东西? 我发现了这个StackOverflow问题 ,但它似乎没有解决问题,或者至少我不明白它应该如何解决。 编辑: 我想得到的结果是能够做到这样的事情: Anything[] anything; //Assign some Instances to anything foreach(Final final in anything){ //do something with final }

为什么我们无法在ASMX Web服务中返回List ?

由于开发人员知道我们无法使用Web服务返回List ,因此我们只能将列表转换为.ToArray(); 我搜索了一些,但无法得到有效的答案为什么我们不能用网络服务重新列出List。 为什么我们必须将它们转换为ToArray(); ?

将IList 转换为IList 在运行时失败

我有以下简短的C#程序: IList listString = new List(); IList listObject; listObject = listString; 这个程序不编译。 最后一行导致以下编译错误: 无法将类型’System.Collections.Generic.IList’隐式转换为’System.Collections.Generic.IList’。 存在显式转换(您是否错过了演员?) 所以,我添加了演员: listObject = (IList)listString; 现在程序正确编译,但在运行时失败。 InvalidCastException并显示以下消息: 无法将类型为’System.Collections.Generic.List’1 [System.String]’的对象强制转换为’System.Collections.Generic.IList’1 [System.Object]’。 强制转换是非法的,应该被编译器捕获,或者它是合法的,不应该在运行时抛出exception。 为什么行为不一致? 澄清:我不是在问为什么演员会失败。 我理解为什么这样的铸造有问题。 我问为什么演员表只在运行时失败。

如何使用OfType 过滤到generics类型的所有变体

我想使用List使用它们的类型过滤List对象。 我的问题是,某些对象属于通用接口类型,但它们没有自己的公共inheritance接口。 我有以下定义: public interface ISeries public interface ITraceSeries : ISeries public interface ITimedSeries : ISeries //and some more… 我的列表包含各种ISeries ,但现在我想只获取ITraceSeries对象,无论它们实际定义的generics类型参数如何,如下所示: var filteredList = myList.OfType<ITraceSeries>(); //invalid argument! 我怎样才能做到这一点? 一个不受欢迎的解决方案是引入一个inheritance自ISeries的类型ISeries : public interface ITraceSeries : ITraceSeries 然后,使用ITraceSeries作为filter。 但这并没有真正添加新信息,只会使inheritance链更复杂。 在我看来,这似乎是一个常见问题,但我没有在SO或网络上找到有用的信息。 感谢帮助!

无法推断出Action 中的type参数,但是从Func 可以得到

我一直在玩仿制药和代表,我发现了一些我不理解的东西。 我有非常相似的通用静态方法,一个接受Action ,第二个接受Func 。 现在的问题是:如果我在没有显式类型的情况下调用接受Func那个,编译器就可以了。 但是接受Action无法编译我的程序(请参阅错误消息的代码)。 我的问题是:为什么编译器能够识别返回类型,但是无法识别参数类型? public interface IMessage { } public class Message : IMessage { } static void HandleAction(Action action) where TMessage : IMessage { } static void HandleFunction(Func action) where TMessage : IMessage { } static void A(Message message) { } static Message F() { return new Message(); } static void […]

为什么C#和VB有generics? 他们提供了什么好处? generics,FTW

来自维基百科 : 通用编程是一种计算机编程风格,其中算法是根据待指定的后续类型编写的,然后在需要时作为参数提供的特定类型进行实例化,并由1983年出现的Ada开创。这种方法允许编写常用function或类型,仅在使用时操作的类型集不同,从而减少重复。 generics提供了定义稍后指定的类型的能力。 您不必将项目转换为类型以使用它们,因为它们已经被键入。 为什么C#和VB有generics? 他们提供了什么好处? 使用它们有什么好处? 还有哪些其他语言也有仿制药?

为什么我可以在它可能不可为空或可能不是对象的情况下测试null的generics?

在编写包含generics变量的类时 public class ServiceInvoker : IDisposable { private TService _Service; public ServiceInvoker() { _Service = Activator.CreateInstance(); } public void Invoke(Action action) { // CAN use null if (_Service == null) throw new ObjectDisposedException(“ServiceInvoker”); …. } public void Dispose() { // CAN’T use null this._Service = default(TService); } } 我注意到编译器允许我检查generics变量的null,但是,当然,不允许我将其设置为null,因此我们必须使用default(TService) 。 不应该编译器警告我,我使用null? 或者它是否使用拳击转换到一个对象来进行null测试? 我读到了关于generics的正确null评估 ,但我很想知道为什么,而不是如何。

方法重载的通用约束

我有一个带有一些generics方法的接口,我想实现一个带有重载的方法来接受一个类的实例,或者它的PK值(它是一个int或GUID但确实变化)。 我添加了类似这些示例的方法: void DoSomething(TKey key) where TKey: struct; void DoSomething(TModel model) where TModel : class; 其中第二个上的’DoSomething’方法名称突出显示,错误是 类型’ISomeStuff’已经定义了一个名为’DoSomething’的成员,它具有相同的参数类型。 我对此感到惊讶,因为我已经通过参数明确定义了不同的类型:一个是类,另一个是结构。 为什么这不足以使签名不同?