Tag: generics

使用Reflection通过签名调用对象实例上的generics方法:SomeObject.SomeGenericInstanceMethod (T参数)

如何调用SomeObject.SomeGenericInstanceMethod(T arg) ? 有一些关于调用generics方法的post,但不完全像这个。 问题是method参数被约束为generics参数。 我知道如果签名是相反的 SomeObject.SomeGenericInstanceMethod(string arg) 然后我可以得到MethodInfo typeof (SomeObject).GetMethod(“SomeGenericInstanceMethod”, new Type[]{typeof (string)}).MakeGenericMethod(typeof(GenericParameter)) 那么,当常规参数是generics类型时,如何获取MethodInfo? 谢谢! 此外,generics参数可能有也可能没有类型约束。

编组.NETgenerics类型

这是一个C#程序,它在几种不同的类型上尝试Marshal.SizeOf : using System; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] class AClass { } [StructLayout(LayoutKind.Sequential)] struct AStruct { } [StructLayout(LayoutKind.Sequential)] class B { AClass value; } [StructLayout(LayoutKind.Sequential)] class C { T value; } class Program { static void M(object o) { Console.WriteLine(Marshal.SizeOf(o)); } static void Main() { M(new AClass()); M(new AStruct()); M(new B()); M(new C()); M(new C()); } […]

具有约束的generics方法的重载解决问题

代码示例: interface IFoo { } class FooImpl : IFoo { } static void Bar(IEnumerable value) where T : IFoo { } static void Bar(T source) where T : IFoo { } 任何人都可以解释,为什么这个方法调用: var value = new FooImpl[0]; Bar(value); 目标Bar(T source) (因此,不编译)? 在解决重载时,编译器是否会考虑类型参数约束? UPD 。 避免与数组混淆。 IEnumerable任何实现都会发生这种情况,例如: var value = new List(); UPD 2 。 @ […]

为什么这个演员不可能?

interface IFolderOrItem where TFolderOrItem : FolderOrItem {} abstract class FolderOrItem {} class Folder : FolderOrItem {} abstract class Item : FolderOrItem {} class Document : Item {} 现在我想这样做: class Something { IFolderItemOrItem SelectedItem { get; set; } void SomeMagicMethod() { this.SelectedItem = (IFolderOrItem)GetMagicDocument(); // bad bad bad … ?? } IFolderOrItem GetMagicDocument() { return someMagicDocument; […]

通用扩展方法解析失败

以下程序无法编译,因为在出​​错的行中,编译器选择使用单个T参数作为分辨率的方法,因为List不适合单个T的通用约束而失败。 编译器无法识别可以使用的其他方法。 如果我删除了单T方法,编译器将正确地找到许多对象的方法。 我已经阅读了两篇关于通用方法解析的博客文章,其中一篇来自JonSkeet,另一篇来自Eric Lippert,但我无法找到解释或解决问题的方法。 显然,使用两个具有不同名称的方法会起作用,但我喜欢这样一个事实:对于这些情况,您只有一种方法。 namespace Test { using System.Collections.Generic; public interface SomeInterface { } public class SomeImplementation : SomeInterface { } public static class ExtensionMethods { // comment out this line, to make the compiler chose the right method on the line that throws an error below public static void Method(this T parameter) […]

c#inheritancegenerics集合和序列化

设置: class Item { private int _value; public Item() { _value = 0; } public int Value { get { return _value; } set { _value = value; } } } class ItemCollection : Collection { private string _name; public ItemCollection() { _name = string.Empty; } public string Name { get {return _name;} set {_name […]

如何使用Dictionary 类型获取TKey和TValue的类型

我希望得到TKey和TValue的类型给出Dictionary类型。 例如。 如果type是Dictionary我想知道如何获取keyType = typeof(Int32)和valueType = typeof(String)

为什么我不能将int转换为T,但是可以将int转换为object然后对象转换为T?

此代码无法编译: public T Get() { T result = default(T); if(typeof(T) == typeof(int)) { int i = 0; result = (T)i; } return result; } 但是,这段代码确实编译: public T Get() { T result = default(T); if(typeof(T) == typeof(int)) { int i = 0; result = (T)(object)i; } return result; } 代码也可以正常工作。 我不明白为什么编译器可以将对象(实际类型可以是任何东西)强制转换为T,但是不能将int(从对象中转移)转换为T.

generics:为什么编译器在这种情况下不能推断出类型参数?

我想写一个扩展方法,它可以用于字典,它的值是某种顺序。 不幸的是,编译器似乎无法从我对该方法的使用中推断出generics参数; 我需要明确指定它们。 public static void SomeMethod (this IDictionary dict) where TValue : IEnumerable { } static void Usage() { var dict = new Dictionary(); var dict2 = new Dictionary<int, IEnumerable>(); //These don’t compile dict.SomeMethod(); SomeMethod(dict); // doesn’t have anything to do with extension-methods dict2.SomeMethod(); // hoped this would be easier to infer but no […]

行动词典代表

我有对象XML序列化消息进入一个名为MessageRouter的类。 XML包含它序列化的类型名称,我需要能够根据运行时之前未知的类型调用不同的委托方法 。 我在仿制药方面并不是非常强大,所以希望这对某些人有意义…… 我希望MessageRouter提供一个RegisterDelegateForType方法,如下所示: myMessageRouter.RegisterDelegateForType(new Action(myActionHandler)); 然后将类型或类型的字符串表示forms存储在字典中,如下所示: Dictionary<Type, Action> registeredDelegates; 这样,我可以执行类似下面的伪代码,调用类型的已分配委托并传递反序列化的对象: Type xmlSerializedType = TypeFromXmlString(incomingXml); object deserializedObject = DeserializeObjectFromXml(xmlSerializedType, incomingXml); // then invoke the action and pass in the deserialized object registeredDelegates[xmlSerializedType](deserializedObject); 所以我的问题是: 如何定义一个可以包含Type作为键和一个通用Action作为值的Dictionary,并使用RegisterDelegateForType方法填充字典? 如果那是不可能的,那么最好的方法是什么?