如果参数名称和字段名称使用反射不同,我如何检索参数的值

本文关键字:参数 何检索 检索 字段 反射 如果 | 更新日期: 2023-09-27 18:00:51

如果参数名称和字段名称不同,如何检索参数的值?到目前为止,我已经研究了大约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);
}

如果参数名称和字段名称使用反射不同,我如何检索参数的值

您的代码有几个问题。

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

然后使用相同的语法来检索字段。但是,如果您执行以下代码:requestType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic),您会看到有两个为您的自动属性生成的具有虚构名称的后备字段。这样做毫无意义检索属性和backing字段。

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

如果这不可能,您应该使用反射来获取属性。可以通过映射参数来执行此操作。将值命名为Names类的一个可能属性。类似于:

if (parameter.Name == "firstname")
{
    property = requestType.GetProperty("First", BindingFlags.Instance | BindingFlags.Public);
}