按字符串类名访问类方法

时间:2016-12-27 10:22:18

标签: c# .net

背景

我有一个名为"object_model"的字符串变量,它可以包含这两个值中的一个("UserImage""CarImage"),并在我的代码中使用它,如下所示:

switch (object_model)
            {
                case "UserImage":
                    { UserImage.Add(img); break; }
                case "CarImage":
                    { CarImage.Add(img); break; }
            }

问题:

我需要避免使用switch语句,只需这样做:

object_model.add(img)

注意:我使用constantize(即model_object.constantize.add(img)

在Ruby on Rails中实现了相同的目标

2 个答案:

答案 0 :(得分:7)

Type t = Type.GetType(object_model);
MethodInfo method = t.GetMethod("Add", BindingFlags.Static | BindingFlags.Public);
method.Invoke(null, new object[] { img });

答案 1 :(得分:2)

似乎你的object_model是一个字符串,在这种情况下你可以写一个扩展方法:

public static class Extensions
{
    public static void Add(this string object_model, Img img)
    {
        switch (object_model)
        {
            case "UserImage":
                { UserImage.Add(img); break; }
            case "CarImage":
                { CarImage.Add(img); break; }
        }
    }
}

你可以像"blabla".Add(img)一样使用它 危险的是,您实际上允许对任何字符串进行此类调用,因此您自己有责任决定是否应添加此模型。

由于您的变量只能有两个值,因此最好将其定义为Enum,并且可以在Enum上调用扩展方法而不是字符串。