c#-如何设置反射调用参数的正确顺序?
我需要从任何类(在同一程序集中)调用任何方法,并将参数传递给trought。到目前为止还不错(我相信),但是调用ask-me以获得一个对象数组(我可以得到),但顺序与方法中预定义的顺序相同 我为参数制作了这个类:c#-如何设置反射调用参数的正确顺序?,c#,.net,reflection,invoke,delegation,C#,.net,Reflection,Invoke,Delegation,我需要从任何类(在同一程序集中)调用任何方法,并将参数传递给trought。到目前为止还不错(我相信),但是调用ask-me以获得一个对象数组(我可以得到),但顺序与方法中预定义的顺序相同 我为参数制作了这个类: public class Parametros { public string type { get; set; } public string name { get; set; } public object value { get; set; } }
public class Parametros {
public string type { get; set; }
public string name { get; set; }
public object value { get; set; }
}
我的“调用”方法如下:
public static void Executar(string namespaceClass, string metodo,List<Parametros> parametros) {
Type type = Type.GetType(namespaceClass);
Object obj = Activator.CreateInstance(type);
MethodInfo methodInfo = type.GetMethod(metodo);
List<object> myParams = new List<object>();
foreach (Parametros myparam in parametros) {
//Get and order the params
myParams.Add(myparam.value);
}
methodInfo.Invoke(obj, myParams.ToArray());
}
publicstaticvoidexecutar(字符串namespaceClass、字符串metodo、列表参数){
Type Type=Type.GetType(namespaceClass);
Object obj=Activator.CreateInstance(类型);
MethodInfo MethodInfo=type.GetMethod(metodo);
List myParams=new List();
foreach(Parametros中的Parametros myparam){
//获取并订购参数
myParams.Add(myparam.value);
}
调用(obj,myParams.ToArray());
}
如果没有在我的类
Parametros
中指定顺序的解决方案,有没有办法实现这一点,获取参数的名称并将其发送到invoke方法?最后我得到了它,我将为任何需要它的人提供答案。它适用于静态和非静态类型。考虑到namespaceClass必须是Namespace.etc.Class
public static void Executar(string namespaceClass, string metodo, List<Parametros> parametros = null)
{
Type type = Type.GetType(namespaceClass);
MethodInfo methodInfo = type.GetMethod(metodo);
Object objectToInvoke;
if (type.IsAbstract && type.IsSealed)
{
objectToInvoke = type;
}
else {
objectToInvoke = Activator.CreateInstance(type);
}
ParameterInfo[] parametersFromMethod = methodInfo.GetParameters();
if (parametros != null || (methodInfo != null && parametersFromMethod != null && parametersFromMethod.Length > 0))
{
List<object> myParams = new List<object>();
foreach (ParameterInfo parameterFound in parametersFromMethod)
{
Parametros parametroEspecificado = parametros.Where(p => p.name == parameterFound.Name).FirstOrDefault();
if (parametroEspecificado != null)
{
myParams.Add(parametroEspecificado.value);
}
else
{
myParams.Add(null);
}
}
methodInfo.Invoke(objectToInvoke, myParams.ToArray());
}
else
{
methodInfo.Invoke(objectToInvoke, null);
}
}
publicstaticvoidexecutar(字符串namespaceClass,字符串metodo,列表参数=null)
{
Type Type=Type.GetType(namespaceClass);
MethodInfo MethodInfo=type.GetMethod(metodo);
对象对象对象为Invoke;
if(type.isastract&&type.IsSealed)
{
objectToInvoke=类型;
}
否则{
objectToInvoke=Activator.CreateInstance(类型);
}
ParameterInfo[]parametersFromMethod=methodInfo.GetParameters();
if(parametros!=null | | |(methodInfo!=null&¶metersfromthod!=null&¶metersfromthod.Length>0))
{
List myParams=new List();
foreach(ParameterInfo Parameter在parametersFromMethod中找到)
{
Parametros parametrospecificado=Parametros.Where(p=>p.name==parameterFound.name).FirstOrDefault();
if(parametrospecificado!=null)
{
添加(parametrospecificado.value);
}
其他的
{
myParams.Add(空);
}
}
调用(objectToInvoke,myParams.ToArray());
}
其他的
{
调用(objectToInvoke,null);
}
}