在反射C#中使用方法

时间:2019-01-22 14:12:42

标签: c# reflection

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";
        }
    }

预先感谢

1 个答案:

答案 0 :(得分:0)

您可以在方法信息上调用.Invoke来执行该方法。

这可以包装到Func中:

Func<string[],string> func = (parameters) => methodInfo.Invoke(null, new object[] { parameters });