c# - 如果不存在则生成方法

标签 c# dynamic methods proxy

上下文

我有一个 C# 类 PyroProxy使用 call(string method, params object[] arguments) 方法

public class PyroProxy : IDisposable {

    public object call(string method, params object[] arguments)
}

这是远程对象的代理类。

动机

在代码中一直使用 call 方法看起来不太好。

问题

假设 PyroProxy 类没有方法 test_method()。 我怎样才能让下面的代码工作?

PyroProxy p = new PyroProxy();
p.test_method();

test_method 的代码如下所示

public object test_method(params object[] arguments) {
    return call("test_method", arguments); // you get the point
}

这可能是我没有找到的副本,也许在编译时或运行时有可能。我该怎么做才能更接近这个目标?提示表示赞赏。有关于如何注入(inject)方法的答案。我找到了 ExpandoObject但它没有告诉我如何创建未知方法。

最佳答案

您应该派生自 DynamicObject然后覆盖 TryInvokeMember方法。

public class PyroProxy : DynamicObject
{
    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        Console.WriteLine(binder.Name + " was invoked");
        result = call(binder.Name, args);
        return true;
    }
}

dynamic proxy = new PyroProxy();
proxy.SomeMethod(); //prints "SomeMethod was invoked"

关于c# - 如果不存在则生成方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24365101/

相关文章:

c# - 如何获取动态类型的属性值?

python - 如何在 Python 中定义类似 int.from_bytes() 的方法?

c# - 如何获得面板上的滚动条位置?窗体 C#

c# - 如何防止正则表达式在第一场比赛中停止?

c# - 角色.IsUserInRole

C# String.Replace 和 UTF-8 字符

css - 标题中的三个div,一个左,一个动态,一个右

c - C 中的堆分配

Java - 为什么我的鼠标不能正确移动?

android - Activity 加载时的调用方法,Android