如果参数名称和字段名称不同,如何检索参数值?到目前为止,我已研究了大约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);
}
答案 0 :(得分:0)
您的代码存在一些问题。
首先,您正在使用requestType.GetProperty(parameter.Name)
。 parameter.Name
可以是firstname
,lastname
或name
。这永远不会等于Names
类的某个属性,因此它将始终返回null
。
然后您使用相同的语法来检索字段。但是,如果要执行以下代码:requestType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
,您会看到为自动属性创建了两个生成的支持字段,其中包含已组成的名称。它毫无意义
检索属性和支持字段。
是否真的有必要使用反射?您在编译时了解所有属性和方法。如果可能,请避免反思。
如果那是不可能的,你应该使用反射来获得财产。您可以通过将parameter.Name值映射到Names
类的可能属性之一来完成此操作。类似的东西:
if (parameter.Name == "firstname")
{
property = requestType.GetProperty("First", BindingFlags.Instance | BindingFlags.Public);
}