使用特定参数调用方法而不使用类型取消装箱

时间:2013-01-11 19:52:29

标签: c# reflection

现在我正在调用一个方法,它可以工作。以下是我正在做的事情的示例:

string result = (string)GetType().InvokeMember(actionName, BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, this, new object[] { userId, roleId, rankId });

调用以下示例方法:

    private string UserName(int userId, int roleId, int rankId)
    {
        ...stuff...
        return "JoeDoe";
    }

我有多个像"UserName"这样的方法,我通过Reflection找到它们,但它们都有相同的签名。 我可以远离打包类型吗?在这种情况下,我是否有办法将{int,int,int}作为参数传递,例如代替新对象[]?

谢谢。

2 个答案:

答案 0 :(得分:4)

否 - 使用反射,您必须将值包装以调用该成员。然而,反射本身的成本相当高,因此在这种情况下装箱操作不是(相对)昂贵的。

如果您可以创建代理,则可以直接调用代理:

Func<int, int, int, string> del = yourClassInstance.UserName;

// use three ints directly here...
string result = del(user, role, rank);

这仍然允许您将不同的委托分配给不同的方法,并调用它们,而不需要反射或装箱的开销。

答案 1 :(得分:3)

我认为使用性能开销的Reflection无法比装箱/拆箱性能开销高得多。

你不应该进行拳击/拆箱。