如何在C#泛型类中调用方法

时间:2019-05-21 21:22:00

标签: c# generics reflection

我是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();

    }

1 个答案:

答案 0 :(得分:3)

我不明白您为什么要使用泛型和反射。 使用继承和多态性可以很容易地实现您要执行的操作,而不必涉及反射,因为性能影响可能是相关的,因此不应该不小心使用反射。

您可以按照我在评论中所说的内容进行操作,但是对于实现与您发布的内容(多个具有相同方法的类)相似的实现而言,这实在太多了。

您可以使用由ICoastStoreEastCoastStore类型实现的接口(例如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();
}