Есть ли способ _somehow_ использовать значение перечисления для передачи вызова метода в качестве универсального параметра этого метода? - PullRequest
1 голос
/ 25 мая 2011

(Вопрос может не иметь достаточного смысла. Его было сложно написать. Не стесняйтесь обновлять его, если вы можете сделать его более понятным.)

У меня есть перечисление:

public enum nodeTypes 
{ 
    Part = 1, 
    SelectListValue, 
    MultiSelectListValue, 
    RepeatingPart,
    ...
}

И метод с регистром коммутации:

switch (type)
{
    case nodeTypes.SelectListValue:
        GenerateSubNode<SelectListValue>(parent, root, depth, true);
        break;
    case nodeTypes.MultiSelectListValue:
        GenerateSubNode<MultiSelectListValue>(parent, root, depth, true);
        break;
    case nodeTypes.Part:
        GenerateSubNode<Part>(parent, root, depth, true);
        break;
    case ....
 }

И еще один метод:

private void GenerateSubNode<ComponentType>(Container parent, ZForm root, int depth, bool isContainer) where ComponentType : Component, new()
{
    ...
    var c = new ComponentType();
    ...
}

Есть ли способ записать этот оператор регистра коммутатора в виде 1 строки?Это похоже на повторяющийся код.

Ответы [ 3 ]

1 голос
/ 25 мая 2011

Вы также можете сделать это с отражением:

typeof( ClassWhereGenerateSubNodeMethodIs ) //alternativly, this.GetType()
   .GetMethod( "GenerateSubNode" )
   .MakeGenericMethod( Type.GetType( "namespace.where.type.classes.are." + type.ToString() ) )
   .Invoke( this, new object[ ] { parent, root, depth, true} );

this, который передается в Invoke, если вызывается экземпляр на ведьме GenerateSubNode, если GenerateSubNode был статическим, высдал бы здесь ноль.

1 голос
/ 25 мая 2011

Может быть, вы могли бы попробовать что-то вроде НЕПРАВИЛЬНО:

    List<ComponentType> types = new List { SelectListValue, MultiSelectValue,...}
    ....
    CompenentType type = types[(int)type];
    GenerateSubNode<type>(parent, root,depth, true);

Или вы могли бы сделать это с фабричным шаблоном.

Редактировать после хороших комментариев:

class VehiculeCreation
{ public static List<Type> vehicules = new List<Type> { typeof(Car), typeof(motor) };
enum Vehicule 
{
    Car = 0,
    Motor = 1,
};


static void Main()
{
    vehicule cars = GenerateVehicules((int)Vehicule.Car);
    vehicule motors = GenerateVehicules((int)Vehicule.Motor);
    cars.print();
    motors.print();

    Console.ReadLine();
}

public abstract class vehicule
{
    public abstract void print();
}

public class Car : vehicule
{
    public override void print() {Console.WriteLine("I am a car");}
}

public class motor : vehicule
{
    public override void print() { Console.WriteLine("I am a motor"); }
}

public static vehicule GenerateVehicules(int index)
{
    return (vehicule)System.Activator.CreateInstance(vehicules[index]);
}

}

0 голосов
/ 25 мая 2011

Как-то так?

Dictionary<nodeTypes, Action<Container, ZForm, int, bool>> generateActions = new Dictionary<nodeTypes, Action<Container, ZForm, int, bool>>
{ 
  {nodeTypes.SelectListValue, GenerateSubNode<SelectListValue> },
  {nodeTypes.MultiSelectListValue, GenerateSubNode<MultiSelectListValue> },
  // .. so on
}

Тогда используйте это:

generateActions[type](parent, root, depth, true);
// todo: does action exist? validation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...