有没有一种方法可以使用枚举值传递方法调用作为该方法的泛型参数

本文关键字:方法 调用 参数 泛型 值传 枚举 一种 可以使 有没有 | 更新日期: 2023-09-27 17:57:47

(这个问题可能没有足够的意义。写起来很难。如果你能让它更清楚,请随时更新。)

我有一个枚举:

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();
    ...
}

有没有办法把switchcase语句写成1行?这感觉像是重复的代码。

有没有一种方法可以使用枚举值传递方法调用作为该方法的泛型参数

也许你可以尝试类似错误的东西:

    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]);
}

}

您也可以使用反射来完成此操作:

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} );

传递给Invokethis是调用GenerateSubNode的实例,如果GenerateSubNode是静态的,则在此处传递null。

类似的东西?

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