c# – 如何访问泛型类中的泛型成员的属性
参见英文答案 >
Accessing properties through Generic type parameter????????????????????????????????????2个
我是C#的新手.我正在尝试创建一个Generic类.我有三个类和一个Main / Generic类. 三个类 public class A { public string Name { get; set; } public string Address { get; set; } public A(string _name,string _address) { Name = _name; Address = _address; } } public class B { public string Name { get; set; } public string Address { get; set; } public B(string _name,string _address) { Name = _name; Address = _address; } } public class C { public string Name { get; set; } public string Address { get; set; } public C(string _name,string _address) { Name = _name; Address = _address; } } 通用类 public class GenericClass<T> { public GenericClass(T obj) { DynamicObject = obj; } public T DynamicObject { get; set; } } 我已经成功创建了一个Generic类. class Program { static void Main(string[] args) { A objA = new A("Mohit","India"); GenericClass<A> objGenericClass = new GenericClass<A>(objA); Console.ReadLine(); } } 现在,如果我需要在Generic类中使用Class A / B / C属性.我怎么用呢?我知道类引用类型决定了运行时.所以,我不能在下面使用它.但是,还有其他方法吗? public class GenericClass<T> { public GenericClass(T obj) { DynamicObject = obj; } public T DynamicObject { get; set; } public void UseClassPro() { Console.WriteLine("Address " + DynamicObject.Address);//Compile time error here. } } 解决方法
其他答案是对的,但……
我只想指出:虽然其他答案可以促进有效的C#代码,但它们会使您实现的通用方面变得极为丰富.你不再需要泛型: 给定一个基类或接口 public interface IHasAddress { string Address { get; } } 你不再需要一个Generic类来实现你想要实现的目标(根据你提供的代码我可以告诉你): public class NotSoGenericClass { public GenericClass(IHasAddress obj) { DynamicObject = obj; } public IHasAddress DynamicObject { get; set; } } 如您所见,您可以轻松实现没有泛型的所需行为. 作为初学者,我会在泛型方面推荐以下基本规则: >当您认为必须使用泛型时,请先强制自己考虑通过接口,抽象类或基类进行抽象.这通常会导致更简单,更清洁的解决方案. 但Nothings错误地认为Generics,它更复杂,而且往往不需要.将上面的类与通用解决方案进行比较: public class GenericClass<T> where T : IHasAddress // just for the sake of generics { public GenericClass(T obj) { DynamicObject = obj; } public T DynamicObject { get; set; } } 看起来更复杂,没有任何好处,是吗?另请注意,无论如何都需要Interface / baseclass.否则,您也可以使用Reflection(不推荐). 要真正回答你的问题 您问题的确切答案是: 您必须定义您的泛型参数必须可以使用分配给IHasAddress public class GenericClass<T> where T : IHasAddress ^^^^^^^^^^^^^^^^^^^^^ This Part 这样,编译器知道T继承或属于IHasAddress类型或您定义的内容.您还可以在此处传递多种类型,这在设计界面时增加了灵活性. 也许,在您的用例中有一些要考虑的问题,这些问题从您在问题中提供的信息中并不明显.在这种情况下,请随意添加一些细节,我也很乐意深入了解这些细节. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |