现在我正在调用一个方法,它可以工作。以下是我正在做的事情的示例:
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}
作为参数传递,例如代替新对象[]?
谢谢。
答案 0 :(得分:4)
否 - 使用反射,您必须将值包装以调用该成员。然而,反射本身的成本相当高,因此在这种情况下装箱操作不是(相对)昂贵的。
如果您可以创建代理,则可以直接调用代理:
Func<int, int, int, string> del = yourClassInstance.UserName;
// use three ints directly here...
string result = del(user, role, rank);
这仍然允许您将不同的委托分配给不同的方法,并调用它们,而不需要反射或装箱的开销。
答案 1 :(得分:3)
我认为使用性能开销的Reflection无法比装箱/拆箱性能开销高得多。
你不应该进行拳击/拆箱。