im试图通过反射实现Dictionary<string, Func<string[], string>>
的字典的实现。截至目前,我已经开始像这样
lCommands.Add(new string[] { "help", "ayuda" }, HelpFunc);
lCommands.Add(new string[] { "cambiacargo", "ccl" }, CambiarCargoLegislador);
lCommands.Add(new string[] { "buscar" }, ObtenerDatosLegislador);
lCommands.Add(new string[] { "listartiemposbloques" }, ObtenerTiemposBloques);
lCommands.Add(new string[] { "modificartiemposbloques" }, ModificarTiempoBloque);
lCommands.Add(new string[] { "logout" }, logout);
lCommands.Add(new string[] { "tienepalabra", "hablado" }, TiempoPalabraActivo);
其中.Add是扩展方法,它采用字符串数组和Func并使其成为同一Func的键。我的问题实际上是我希望能够进行反思。因此,搜索了一会儿之后,我就想到了这个
foreach (MethodInfo methodInfo in typeof(CommandHelper).GetMethods(BindingFlags.NonPublic | BindingFlags.Static))
{
string methodName = methodInfo.Name;
object[] attribute = methodInfo.GetCustomAttributes(typeof(Command), true);
if (attribute.Length > 0)
{
Command myAliases = (Command)attribute[0];
lCommands.Add(myAliases.alias, /* here is my problem propertyInfo.Name*/);
}
}
但是我不确定如何将methodInfo转换为Func<string[],string>
。总结起来,我想对带有反射的第一段代码做同样的事情
只要有人需要,这就是其中一个功能的示例
[Help(Remainder = "Obtiene el tiempo hablado por un legislador")]
[Command("tienepalabra,hablado,tpa")]
private static string TiempoPalabraActivo(string[] arg)
{
LegisladorService leServ = new LegisladorService();
try
{
return $"el legislador {leServ.TraerPorIdNombreApellido(Form1._server.tienePalabra)} estuvo hablando durante {Form1._server.TiempoPalabra()}";
}
catch (Exception)
{
return "No hay legislador con palabra activo";
}
}
预先感谢
答案 0 :(得分:0)
您可以在方法信息上调用.Invoke
来执行该方法。
这可以包装到Func中:
Func<string[],string> func = (parameters) => methodInfo.Invoke(null, new object[] { parameters });