Tag: generics

C#Reflection – 如何判断对象o是否为KeyValuePair类型,然后进行转换?

我正在尝试用LinqPad编写一个Dump()方法,等同于我自己的问题。 我正在从Java迁移到C#,这是一个练习而不是业务需求。 除了倾倒字典之外,我几乎所有的东西都在工作。 问题是KeyValuePair是一种Value类型。 对于大多数其他值类型,我只需调用ToString方法,但这是不够的,因为KeyValuePair可能包含Enumerables和其他具有不良ToString方法的对象。 所以我需要弄清楚它是否是一个KeyValuePair,然后再投射它。 在Java中,我可以使用通配符generics,但我不知道C#中的等价物。 在给定对象o的情况下,您的任务确定它是否为KeyValuePair并在其键和值上调用Print。 Print(object o) { … } 谢谢!

ObservableCollection属性类

我在MVVM项目中重复这个属性太多次了。 创建generics类或工厂来替换这些代码行的正确方法是什么? ObservableCollection _resultCollection; public ObservableCollection ResultCollection { get { if (_resultCollection == null) _resultCollection = new ObservableCollection(); return _resultCollection; } set { _resultCollection = value; } }

动态调用通用目标上的方法

我有一个通用接口ICommandHandler ,它将具有许多实现,每个实现用于处理ICommand的特定实现,例如: public class CreateUserCommand : ICommand { … } public class CreateUserCommandHandler : ICommandHandler { … } 当我给出一个ICommand对象时,我试图将它动态地分配给正确的ICommandHandler 。 目前我在调度程序类中使用了一个非常直接的reflection方法和一个Invoke : public void Dispatch(T command) where T : ICommand { Type commandType = command.GetType(); Type handlerType = typeof(ICommandHandler).MakeGenericType(commandType); object handler = IoC.Get(handlerType); MethodInfo method = handlerType.GetMethod(“Handle”); method.Invoke(handler, new object[] { command }); } 这种方法存在两个问题。 […]

如何在.NET 2.0中创建自定义集合

嗨,我想创建自定义集合,我从CollectionBase类派生我的自定义集合类,如下所示: public class MyCollection : System.Collectio.CollectionBase { MyCollection(){} public void Add(MyClass item) { this.List.Add(item); } } class MyClass { public string name; } 我来问几个问题: 当我在.NET 3.5框架上工作时,这种方法是否正确和新。 我想从我的Web服务(WCF)中公开这个集合。我该怎么做? 我必须实现GetEnumerator吗? 这是否会绑定到DataGridView。

来自IEnumerable的foreach中特定类型的对象

我正在使用只实现非通用IEnumerable和ICollection的旧集合对象。 当我尝试将此对象与foreach在foreach表达式的LHS上给出更具体的类型时,该对象究竟发生了什么? // LegacyFooCollection implements non-generic IEnumerable LegacyFooCollection collection = GetFooCollection(); foreach (Foo f in collection) { // etc. } 我知道(因为我已经尝试过了)当collection所有东西都是Foo类型时,这是安全的,但如果失败会发生什么?

有没有办法确定generics类型是否是从特定的generics类型定义构建的?

我有一个通用的方法: Func<IEnumerable, bool> CreateFunction() 其中T可以是任意数量的不同类型。 这个方法使用reflection做一堆东西,如果T是一个IDictionary ,不管字典的TKey和TValue我需要执行字典特定的代码。 所以可以调用该方法: var f = CreateFunction(); var f0 = CreateFunction(); var f1 = CreateFunction<IDictionary>(); var f2 = CreateFunction<Dictionary>(); var f3 = CreateFunction<SomeDerivedDictionaryType>(); 等等 根据@Andy的回答澄清 最后我想知道Tinheritance自/实现IDictionary即使T本身是Dictionary或从该接口派生的其他类型。 if(typeof(T) == typeof(IDictionary) 不起作用,因为T是generics类型而不是generics类型定义。 并且在不知道TKey和TValue (在编译时不知道)的情况下,我无法对运行时我知道的任何具体类型进行比较。 我唯一想到的就是查看类型的名称或者用reflection检查它的方法,寻找能让我相信它是字典的方法(即查找ContainsKey和get_Item )。 有没有直接的方法来做出这种决定?

如何确定ParameterInfo是否为generics类型?

我有一个GenericMethodDefinition的MethodInfo 。 如: CallMethod(T arg, string arg2) 。 GetParameters()方法将为我提供两个ParameterInfo对象,第一个是通用的,第二个不是。 如何让ParameterInfo告诉我它是通用的? 如果有约束怎么办?

为什么List 在协变接口MyInterface 上无效

跟进前一个问题的问题 ,这被认为是一个共同变异问题。 更进一步,如果我按如下方式修改IFactory : class Program { static void Main(string[] args) { IFactory factory = new Factory(); } } class Factory : IFactory { } class Product : IProduct { } interface IFactory where T : IProduct { List MakeStuff(); } interface IProduct { } 我明白了: 方差无效:类型参数T必须在Sandbox.IFactory.MakeStuff()上不变地有效。 T是协变的。 为什么这不是无效的? 该如何/应该如何解决?

为什么我得到“类型参数必须是无效的……”错误?

我将尝试缩短此代码示例: public interface IThing { //… Stuff } public class Thing1 : IThing { } public class Thing2 : IThing { } public interface IThingView { ICollection ViewAll(); } public class ThingView : IThingView { ICollection ViewAll() { return new List(); } // There’s a big operation here } public interface IThingViewerFactory { public IThingView […]

在C#中将通用对象添加到通用列表

我上课的相关部分看起来像 class C { void Method(SomeClass obj) { list.Add(obj); } List list = new List(); } 我应该如何定义列表以便类编译? 我想要一个List<SomeClass>类型的List<SomeClass> ,它是SomeClass的对象列表,其中每个对象可以有任何类型参数。 Java ? 构造允许这个; 什么是C#等价物? 如果不存在这样的事情,是否有合适的解决方法? ( List会做但非常难看。)