0

如果参数名称和字段名称不同,如何检索参数的值?到目前为止,我已经研究了大约 2 天,但无法找到解决方案。任何帮助表示赞赏。我在下面提供了示例代码。

class Class1
{        
    public void method(string firstname, string lastname, out string name)
    {
        name = lastname + ", " + firstname;
    }
}

class Names
{
    public string First
    {
        get;
        set;
    }
    public string Last
    {
        get;
        set;
    }
}

class FullName
{
    public string Full
    {
        set;
        get;
    }
}
private void btnExecute_Click(object sender, EventArgs e)
{
        Class1 cls = new Class1();
        Names request = new Names();
        request.First = "Mohanraj";
        request.Last = "Devadoss";
        FullName response = new FullName();

        MethodInfo methodInfo = cls.GetType().GetMethod("method");
        ParameterInfo[] parameters = methodInfo.GetParameters();
        ParameterInfo returnParameter = methodInfo.ReturnParameter;
        var inputParameters = new object[parameters.Length];

        Type requestType = request.GetType();
        PropertyInfo[] properties = requestType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
        object result = null;
        int count = 0;
        const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance;

        foreach (ParameterInfo parameter in parameters)
        {
            PropertyInfo property = requestType.GetProperty(parameter.Name);
            FieldInfo field = requestType.GetField(parameter.Name);
            MemberInfo[] members = requestType.GetFields(bindingFlags).Cast<MemberInfo>().Concat(requestType.GetProperties(bindingFlags)).ToArray();

            object value = null;

            try { value = property.GetValue(request, null); }
            catch { value = null; }
            try
            {
                value = field.GetValue(request);
            }
            catch
            {
                value = null;
            }

            if (parameter.ParameterType.IsByRef)
            {
                value = null;
            }

            inputParameters[count] = value;
            count = count + 1;
        }

        result = methodInfo.Invoke(cls, inputParameters);
}
4

1 回答 1

0

您的代码有几处问题。

首先,您正在使用requestType.GetProperty(parameter.Name). parameter.Name可以firstnamelastnamename。这永远不会等于Names类的属性之一,因此它将始终返回null

然后,您将使用相同的语法来检索字段。但是,如果您执行以下代码:requestType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic),您会看到为您的自动属性生成了两个具有组成名称的支持字段。同时检索属性和支持字段是没有意义的。

真的有必要使用反射吗?您在编译时就知道所有的属性和方法。如果可能,请避免反思。

如果这不可能,您应该使用反射来获取属性。您可以通过将 parameter.Name 值映射到Names类的可能属性之一来做到这一点。就像是:

if (parameter.Name == "firstname")
{
    property = requestType.GetProperty("First", BindingFlags.Instance | BindingFlags.Public);
}
于 2013-02-22T19:10:57.623 回答