Общий вызов нестатического метода абстрактного класса c # - PullRequest
0 голосов
/ 28 августа 2018

В моем коде у меня есть перечисления, такие как Vehicle, ParkingArea и т. Д., И я расширил их, чтобы пользователь мог использовать значения по умолчанию Vehicle и ParkingArea, а также добавлять / обновлять свои собственные, которые сохраняются в базе данных. У меня есть абстрактный класс, как,

public abstract class EnumExtension<T> where T : struct
{
   public bool updateEnum(string name){
     //code to update the enum extension
   }
}

И есть контроллер, подобный следующему, для доступа к вышеуказанному методу обновления

public class MyController : ApiController
{   
   public void UpdateAnyEnum(string newName, int value, string typeName){
     var enum_1 = (EnumExtensionForVehicle)value;
     enum_1.updateEnum(newName);
   }
}

Мне нужно сделать этот метод UpdateAnyEnum универсальным, поскольку я не знаю, пытается ли пользователь обновить Vehicle или ParkingArea В этом методе мне нужно определить EnumExtensionForVehicle динамически и позвонить на updateEnum Параметр typeName содержит тип enum, который я пытаюсь редактировать, т.е. либо Vehicle, либо ParkingArea

Мне нужно сделать UpdateAnyEnum универсальным методом. Любые мысли и идеи очень ценятся. Спасибо.

1 Ответ

0 голосов
/ 28 августа 2018

Я не уверен, как вы определяете класс для вызова. В общем, вам нужна ссылка на EnumExtension в UpdateAnyEnum. А для значения T вам нужно сделать его UpdateAnyEnum универсальным. Нечто вроде ниже.

Примечание: приведенный ниже код не тестируется. Это просто представление о том, как должен работать код

public abstract class EnumExtension<T> where T : struct
{
   public bool updateEnum(string name){
     //code to update the enum extension
   }
}

public class EnumExtensionForVehicle : EnumExtension<Vehicle>
{
   public bool updateEnum(string name){
     //code to update the enum extension
   }
}

public class EnumExtensionForParkingArea : EnumExtension<ParkingArea>
{
   public bool updateEnum(string name){
     //code to update the enum extension
   }
}

public class MyController : ApiController
{   
   public void UpdateAnyEnum<T>(string newName, int value, string typeName) {
        EnumExtension<T> factory;

        switch (typeName)
        {
            case "Vehicle":
                factory = new EnumExtensionForVehicle();
                break;
            case "ParkingArea":
                factory = new EnumExtensionForParkingArea();
                break;
        }

        factory.updateEnum(newName);
   }
}
...