Tag: generics

如何获取基类的generics类型参数?

我有三节课如下: public class TestEntity { } public class BaseClass { } public class DerivedClass : BaseClass { } 我已经在运行时使用reflection获取了DerivedClass的System.Type对象。 如何使用reflection获取TestEntity的System.Type对象? 谢谢。

在运行时创建类型“MyClass:OtherClass {}”?

在C#中是否可以在运行时创建一个inheritance自generics类的类型,其中基类的模板参数是正在构造的当前类? 这将编译正常: // I have this class: public class OtherClass where T : OtherClass { } // I want to create this at runtime: public class MyClass : OtherClass { } 但我不知道如何使用System.Reflection.Emit.ModuleBuilder.TypeBuilder创建MyClass : AssemblyName asn = new AssemblyName(“test.dll”); AssemblyBuilder asb = AppDomain.CurrentDomain.DefineDynamicAssembly( asn, AssemblyBuilderAccess.RunAndSave, @”D:\test_assemblies”); ModuleBuilder = modb = asb.DefineDynamicModule(“test”, “test.dll”); TypeBuilder tb = modb.DefineType( […]

无法从generics类型转换为接口

我在尝试将通用对象添加到List 时遇到错误。 它可能与Covariance和Contravariance有关,但我不知道如何解决这个问题。 我试图用T:IRegister来限制我的generics类型。 我有一个接口来表示一个寄存器,然后是两个代表ByteRegister和DoubleWordRegister的类。 public interface IRegister { string Name {get;set;} } public class ByteRegister : IRegister { … } public class DoubleWordRegister : IRegister { … } 然后,我有另一个类,它代表了所有相同类型的这些寄存器的块。 public class RegisterBlock where T:IRegister { private IList _registers; … constructors, properties etc public void AddRegister(T register) { _registers.Add(register); } } 最后我有一个RegisterMap类,用于定义寄存器块列表和块内的每个寄存器。 public class RegisterMap […]

检查对象是否为字典或列表

使用单声道的.NET 2,我使用的是一个基本的JSON库,它返回嵌套的字符串,对象字典和列表。 我正在编写一个mapper来将它映射到我已经拥有的jsonData类,我需要能够确定object的基础类型是Dictionary还是List。 下面是我用来执行此测试的方法,但是想知道这是否更干净? private static bool IsDictionary(object o) { try { Dictionary dict = (Dictionary)o; return true; } catch { return false; } } private static bool IsList(object o) { try { List list = (List)o; return true; } catch { return false; } } 我正在使用的库是litJson但JsonMapper类本质上不适用于iOS,因此我正在编写自己的映射器。

PropertyInfo.GetValue() – 如何使用C#中的reflection索引到generics参数?

这个(缩短的)代码.. for (int i = 0; i < count; i++) { object obj = propertyInfo.GetValue(Tcurrent, new object[] { i }); } ..正在抛出’TargetParameterCountException:参数计数不匹配’exception。 ‘propertyInfo’的基础类型是一些T的集合。’count’是集合中的项目数。 我需要遍历集合并对obj执行操作。 建议表示赞赏。

generics类型参数和Nullable方法重载

你好 我有使用generics和可空的代码: // The first one is for class public static TResult With(this TInput o, Func evaluator) where TResult : class where TInput : class // The second one is for struct (Nullable) public static TResult With(this Nullable o, Func evaluator) where TResult : class where TInput : struct 请注意TInput约束,一个是类,另一个是struct。 然后我用它们: string s; int? i; […]

c#generic,包括数组和列表?

这是一个非常方便的扩展,适用于任何array : public static T AnyOne(this T[] ra) where T:class { int k = ra.Length; int r = Random.Range(0,k); return ra[r]; } 不幸的是,它不适用于List的任何东西。 这是适用于任何List的相同扩展名 public static T AnyOne(this List listy) where T:class { int k = listy.Count; int r = Random.Range(0,k); return listy[r]; } 事实上,是否有一种方法可以一次性推广包含array和List s的generics? 还是知道不可能? 它发生在我身上,答案甚至可以进一步包含Collection s? 或者确实有下面的专家之一已经实现了?? PS,我很抱歉没有明确提到这是在Unity3D环境中。 “Random.Range”是一个统一到骨骼的function,“AnyOne”调用将100%的游戏引擎读作任何游戏工程师。 这是你为任何游戏项目输入的第一个扩展,并且你经常在游戏代码中使用它(“任何爆炸!”“任何硬币声音效果!”等等!) 显然,它当然可以在任何c#milieu中使用。

无论如何要将通用参数默认为某种类型?

有没有办法为generics的参数T提供默认类型,如: class Something { } 我知道没有太多强有力的理由,但我想暗示代码客户端应该优先使用哪种类型。 另外,我可以将generics类型限制为ValueType吗? 我刚刚看到你不能,但我仍然想知道为什么。 有人有线索吗? 谢谢!

如何将类型为string的对象动态转换为类型为T的对象

我有这个XML文档 False 在我的代码中,我正在尝试构建一个包含节点的参数数组。 object test = (object) ((typeof(publishNode.Attributes[“Type”].value)) publishNode.InnerText); 这当然在编译时打破了。 我无法弄清楚如何将publishNode.InnerText(‘false’)转换为XML文件中指定类型的运行时定义对象,并将其存储在对象中(这将保留类型)。

C#4.0“动态”关键字是否会使generics多余?

我对C#中的动态特性感到非常兴奋( C#4动态关键字 – 为什么不呢? ),特别是因为在我的代码的某些库部分我使用了很多reflection。 我的问题有两个: 1.“动态”取代generics,如下所示? generics方法: public static void Do_Something_If_Object_Not_Null(SomeType ObjToTest) { //test object is not null, regardless of its Type if (!EqualityComparer.Default.Equals(ObjToTest, default(SomeType))) { //do something } } 动态方法(??): public static void Do_Something_If_Object_Not_Null(dynamic ObjToTest) { //test object is not null, regardless of its Type?? but how? if (ObjToTest != null) { //do […]