给定静态类:
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
类中。编辑2:
从到目前为止的答复来看,我希望它适用于下面的Gold
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
并完全避免反射。