1

与えられた静的クラス:

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.ConverterFuncリフレクションを使用してゴールドを呼び出すにはどうすればよいですか? これが私がこれまでに持っているものです:

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

編集:

Converters異なるパラメーターを使用する可能性のある他の Funcs をクラスに追加することを計画していることを言及する必要がありました。

Edit2: これまでの返信から、Func以下のゴールドで機能しています。私の質問は、Func. たとえば、次のように別のコンバーターを作成したい場合がありますFunc<string, string>。私が確信できる唯一のことは、(異なる型の) パラメーターは 1 つだけであり、戻り値は常に文字列になるということです。

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));
4

2 に答える 2

3

静的メンバーを取得するには、BindingFlags を指定する必要があります。

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

GetFieldif it will never be a propertyを使用して、これを単純化することもできます。

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フィールド名の方が簡単になる可能性を考慮し、リフレクションを完全に回避する必要があります。

于 2012-11-29T23:10:35.717 に答える
2

関数やプロパティではないため、そのようなメンバーを呼び出すことはできません。最初にその値を取得し、適切にキャストしてから、次のように結果を呼び出す必要があります。

var converter = typeof(Converters).GetField(regEx.Converter);
var f = converter.GetValue(null) as Func<long,string>;
var matchedValueString = f(matchedValueInt);
于 2012-11-29T23:07:29.183 に答える