Как вызвать метод в обобщенном классе C # - PullRequest
0 голосов
/ 22 мая 2019

Я новичок в дженериках C #. У меня есть несколько классов с одинаковыми методами. Я хочу создать универсальный класс, который будет иметь тип, принадлежащий любому из этих классов, и вызывать методы из них. Я не уверен, возможно ли это, или есть другой способ сделать это. Я дал мой пример кода ниже. Я включил два представительных класса, названных, EastCoastStores и WestCoastStores. Когда я пытаюсь вызвать метод с использованием отражения, я получаю исключение нулевой ссылки для GetMethod ("GetZipCode") в методе GetZipCode () класса MyGenerics. Я искал в интернете, но не смог найти подходящего решения.

//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 Ответ

3 голосов
/ 22 мая 2019

Я не понимаю, почему вы используете дженерики и рефлексию. То, что вы пытаетесь сделать, может быть легко достигнуто с помощью наследования и полиморфизма, без привлечения рефлексии, которую не следует использовать небрежно, так как это может повлиять на производительность.

Вы можете следовать тому, что я сказал в комментарии, но это было бы слишком много для реализации, аналогичной той, которую вы опубликовали (несколько классов с одинаковыми методами).

Вы можете использовать интерфейс (например, 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...