从C#中的字符串调用类对象的函数

时间:2018-09-14 00:38:30

标签: c# .net string reflection function-call

无论如何我都会使用WPF mvvm模式,如果有可能像

这样调用了字符串参数
@IBDesignable
class CircleExampleView: UIView {

    override func layoutSubviews() {
        setupMask()
    }

    func setupMask() {

        let path = makePath()

        // mask the whole view to that shape
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
    }

    private func makePath() -> UIBezierPath {

        //// Oval Drawing
        let ovalPath = UIBezierPath(ovalIn: CGRect(x: 11, y: 12, width: 30, height: 30))
        UIColor.gray.setFill()
        ovalPath.fill()

        return ovalPath
    }
}

关键是通过无分支或数据结构映射的参数调用类对象的功能

也许正在使用反射..任何好主意?

1 个答案:

答案 0 :(得分:1)

是的,通过反射是可能的。您可以使用Invoke方法。

它看起来像这样:

MethodInfo method = type.GetMethod(name); object result = method.Invoke(objectToCallTheMethodOn);

话虽如此,通常情况下,您不应该使用反射来调用c#中的方法。这仅适用于非常特殊的情况。


这是一个完整的例子:

class A 
{
    public int MyMethod(string name) {
        Console.WriteLine( $"Hi {name}!" );
        return 7;
    }
}



public static void Main()
{
    var a = new A();
    var ret = CallByName(a, "MyMethod", new object[] { "Taekyung Lee" } );
    Console.WriteLine(ret);
}

private static object CallByName(A a, string name, object[] paramsToPass )
{
    //Search public methods
    MethodInfo method = a.GetType().GetMethod(name);
    if( method == null )
    {
        throw new Exception($"Method {name} not found on type {a.GetType()}, is the method public?");
    }
    object result = method.Invoke(a, paramsToPass);
    return result;
}

此打印:

Hi Taekyung Lee!
7