我是C#泛型新手。我有几个使用相同方法的类。我想创建一个泛型类,该泛型类属于那些类中的任何一个,并从中调用方法。我不确定这是否可行,或者有其他方法可以做到。我在下面给出了我的代码示例。我包括两个名为EastCoastStores和WestCoastStores的代表性类。当我尝试使用反射调用该方法时,我在MyGenerics类的GetZipCode()方法中获取了GetMethod(“ GetZipCode”)的空引用异常。我已经搜索了互联网,但找不到合适的解决方案。
//Two classes with identical methods
public class EastCoastStores
{
private string zip;
public void SetZipCode(string zip)
{ this.zip = zip; }
public string GetZipCode()
{ return zip; }
}
public class WestCoastStores
{
private string zip;
public void SetZipCode(string zip)
{ this.zip = zip; }
public string GetZipCode()
{ return zip; }
}
//Generic class which can accept either of the above classes
public class MyGenerics<T>
{
private T selectedValues;
public MyGenerics(T selectedValues)
{
this.selectedValues = selectedValues;
}
public String GetZipCode()
{
Type typeParameterType = typeof(T);
var getZipCode = typeParameterType.GetMethod("GetZipCode");
var val =
typeParameterType.GetType().GetMethod("GetZipCode").Invoke(typeParameterType,
null);
return val.ToString();
}
}
//Accessing the class method
public static void Main(string[] args)
{
EastCoastStores eastCoastStores = new EastCoastStores();
eastCoastStores.SetZipCode("12345");
MyGenerics<EastCoastStores> orderAction = new
MyGenerics<EastCoastStores>(eastCoastStores);
var val = orderAction.GetZipCode();
}
答案 0 :(得分:3)
我不明白您为什么要使用泛型和反射。 使用继承和多态性可以很容易地实现您要执行的操作,而不必涉及反射,因为性能影响可能是相关的,因此不应该不小心使用反射。
您可以按照我在评论中所说的内容进行操作,但是对于实现与您发布的内容(多个具有相同方法的类)相似的实现而言,这实在太多了。
您可以使用由ICoastStore
和EastCoastStore
类型实现的接口(例如WestCoastStore
)。然后,您无需使用反射,并且MyGenerics
的实现将更加简单。
public class EastCoastStores : ICoastStore
{
private string zip;
public void SetZipCode(string zip)
{ this.zip = zip; }
public string GetZipCode()
{ return zip; }
}
public class WestCoastStores : ICoastStore
{
private string zip;
public void SetZipCode(string zip)
{ this.zip = zip; }
public string GetZipCode()
{ return zip; }
}
public interface ICoastStore
{
void SetZipCode(string zip);
string GetZipCode();
}
public class MyGenerics
{
private ICoastStore selectedValues;
public MyGenerics(ICoastStore selectedValues)
{
this.selectedValues = selectedValues;
}
public string GetZipCode()
{
return selectedValues.GetZipCode();
}
}
static void Main(string[] args)
{
EastCoastStores eastCoastStores = new EastCoastStores();
eastCoastStores.SetZipCode("12345");
MyGenerics orderAction = new MyGenerics(eastCoastStores);
var val = orderAction.GetZipCode();
}