我是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;
}
}
Run Code Online (Sandbox Code Playgroud)
通用类
public class GenericClass<T>
{
public GenericClass(T obj)
{
DynamicObject = obj;
}
public T DynamicObject { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我已经成功创建了一个Generic类.
class Program
{
static void Main(string[] args)
{
A objA = new A("Mohit", "India");
GenericClass<A> objGenericClass = new GenericClass<A>(objA);
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我需要在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.
}
}
Run Code Online (Sandbox Code Playgroud)
定义界面:
public interface IABC
{
string Name { get; set; }
string Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并在您的泛型类定义中指定此接口:
public class GenericClass<T> where T: IABC
{
public GenericClass(T obj)
{
DynamicObject = obj;
}
public IABC DynamicObject { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
你的所有3个类都实现了这个接口:
public class A : IABC
public class B : IABC
public class C : IABC
Run Code Online (Sandbox Code Playgroud)
之后你可以调用属性 IABC
A objA = new A("Mohit", "India");
GenericClass<A> objGenericClass = new GenericClass<A>(objA);
var adress = objGenericClass.DynamicObject.Address;
Run Code Online (Sandbox Code Playgroud)
我只想指出:虽然其他答案可以促进有效的C#代码,但它们会使您实现的通用方面变得极为丰富.你不再需要泛型:
给定一个基类或接口
public interface IHasAddress
{
string Address { get; }
}
Run Code Online (Sandbox Code Playgroud)
你不再需要一个Generic类来实现你想要实现的目标(根据你提供的代码我可以告诉你):
public class NotSoGenericClass
{
public GenericClass(IHasAddress obj)
{
DynamicObject = obj;
}
public IHasAddress DynamicObject { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如您所见,您可以轻松实现没有泛型的所需行为.
作为初学者,我会在泛型方面推荐以下基本规则:
但 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; }
}
Run Code Online (Sandbox Code Playgroud)
看起来更复杂,没有任何好处,是吗?另请注意,无论如何都需要Interface/baseclass.否则,您也可以使用Reflection(不推荐).
要真正回答你的问题
您问题的确切答案是:
您必须定义通用参数必须可分配给IHasAddress使用
public class GenericClass<T> where T : IHasAddress
^^^^^^^^^^^^^^^^^^^^^
This Part
Run Code Online (Sandbox Code Playgroud)
这样,编译器就知道T继承或属于类型IHasAddress或您定义的内容.您还可以在此处传递多种类型,这在设计界面时增加了灵活性.
也许,在您的用例中有一些要考虑的问题,这些问题从您在问题中提供的信息中并不明显.在这种情况下,请随意添加一些细节,我也很乐意深入了解这些细节.
| 归档时间: |
|
| 查看次数: |
1227 次 |
| 最近记录: |