繁体   English   中英

使用反射从静态类调用静态Func

[英]Calling a static Func from a static class using reflection

给定静态类:

public static class Converters
{
    public static Func<Int64, string> Gold = c => String.Format("{0}g {1}s {2}c", c/10000, c/100%100, c%100);
}

我从数据库收到Func名称作为字符串( regEx.Converter )。 如何使用反射调用Gold Func 这是我到目前为止的内容:

var converter = typeof(Converters).GetMember(regEx.Converter);
if (converter.Count() != 1)
{
    //throw new ConverterNotFoundException;
}                    
matchedValue = converter.Invoke(null, new object[]{matchedValue}) as string;

编辑:

我应该提到,我计划将其他Funcs添加到我的Converters类中,这些Func可以采用不同的参数。

编辑2:从到目前为止的答复,我有它为下面的黄金Func 我想我现在的问题是,当我不知道Func的参数时如何进行这项工作。 例如,我可能想这样创建另一个转换器: Func<string, string> 我唯一可以确定的是,只有一个参数(不同类型),并且返回始终是字符串。

var converter = typeof(Converters).GetField("w", BindingFlags.Static | BindingFlags.Public);
if (converter == null)
{
    //throw new ConverterNotFoundException;
}
var f = converter.GetValue(null) as Func<Int64, string>;
matchedValue = f.Invoke(Convert.ToInt64(matchedValue));

您需要指定BindingFlags以获得静态成员:

var converter = typeof(Converters).GetMember(regEx.Converter,
    BindingFlags.Static | BindingFlags.Public);

如果永远都不是属性,也可以使用GetField简化此操作:

FieldInfo converter = typeof(Converters).GetField(regEx.Converter,
    BindingFlags.Static | BindingFlags.Public);

编辑:
我不确定这会带来很大的帮助,因为您仍然需要知道传递Func<>什么样的参数,但是这将使您可以调用Func<>而不进行转换:

var matchedValue = converter.GetValue(null);
matchedValue.GetType().GetMethod("Invoke")
    .Invoke(matchedValue, new object[] { Convert.ToInt64(0) });

并获取参数的类型:

matchedValue.GetType().GetGenericArguments()[0];

您应该考虑这样一种可能性,即可以更轻松地switch字段名称,并且完全避免反射。

由于它不是函数或属性,因此不能像这样调用成员。 您应该首先获取其值,将其转换为适当的值,然后才调用结果,如下所示:

var converter = typeof(Converters).GetField(regEx.Converter);
var f = converter.GetValue(null) as Func<long,string>;
var matchedValueString = f(matchedValueInt);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM