如果参数名称和字段名称使用反射不同,我如何检索参数的值
本文关键字:参数 何检索 检索 字段 反射 如果 | 更新日期: 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
可以是firstname
、lastname
或name
。这永远不能等于Names
类的属性之一,因此它将始终返回null
。
然后使用相同的语法来检索字段。但是,如果您执行以下代码:requestType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
,您会看到有两个为您的自动属性生成的具有虚构名称的后备字段。这样做毫无意义检索属性和backing字段。
真的有必要使用反射吗?在编译时,您知道所有的属性和方法。如果可能的话,尽量避免反思。
如果这不可能,您应该使用反射来获取属性。可以通过映射参数来执行此操作。将值命名为Names
类的一个可能属性。类似于:
if (parameter.Name == "firstname")
{
property = requestType.GetProperty("First", BindingFlags.Instance | BindingFlags.Public);
}