4

现在我正在调用一个方法并且它有效。这是我正在做的一个示例:

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"这里所示,我通过反射找到了,但它们都有相同的签名。我可以远离类型拆箱吗?在这种情况下,有没有办法让我{int,int,int}作为参数传递,而不是 new object[] ?

谢谢你。

4

2 回答 2

4

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

如果您可以改为委托,则可以直接调用委托:

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

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

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

于 2013-01-11T19:55:06.617 回答
3

我认为使用性能开销的反射比装箱/拆箱性能开销要高得多。

你不应该随身携带装箱/拆箱。

于 2013-01-11T19:56:55.257 回答