1

これはかなり複雑な質問かもしれませんが、答えがあるかどうかを確認するだけです。

大まかに次のように見える 2 つの拡張メソッドがあると考えてください (そして、それらは私が制御できない別のアセンブリにあります)。

public static class ExtensionMethods
{
    public static string ConversionA<T>(this T self) { /* .... */ }
    public static string ConversionB<T>(this T self) { /* .... */ }
} // eo class ExtensionMethods

オブジェクトでこの拡張メソッドを使用するメソッドがあります。理想的には、使用する変換関数を呼び出し元に明示的に指定してもらいたいのですが、必要に応じてデフォルトに設定するので、何らかの方法で署名をFunc<>:

public static class Config
{
    public static T Read<T>(string fileName, Func<T, string> = ExtensionMethods.ConversionA<T>)
    {
    }
} // eo class Config

これはまったく可能ですか?私はそれがロングショットであることを知っています:)

4

2 に答える 2

1

編集

残念ながら、デフォルトのメソッドを定義するように依頼した場所を見逃していました。これは不可能です。C# では、コンパイル時定数ではないものに対して既定のパラメーターを割り当てることを明示的に禁止しています。これを回避する唯一の方法は、オーバーロードされたメソッドをいくつかセットアップすることです。

public static T Read<T>(T input)
{
    Read(input, ExtensionMethods.ConversionA<T>);
}

public static T Read<T>(T input, Func<T, string> conversion)
{
    // Logic goes here
}

全体として、それほど悪くはありません。これはほんの少しの余分なコードであり、探している動作が得られます。

オリジナル

あなたが持っているものは本質的に機能するはずです。を受け入れることを指定するだけですFunc<T, string>常にConversionA<T>またはのいずれかになることを強制することはできませんConversionB<T>が、これらの型シグネチャのいずれかが を満たす必要がありFunc<T, string>ます。

例(変換メソッドが何をするかわからないので、自分で作成します):

public static class Conversions
{
    public static string UpperString<T>(T self)
    {
        return self.ToString().ToUpper();
    }

    public static string LowerString<T>(T self)
    {
        return self.ToString().ToLower();
    }
}

public static T Read<T>(T input, Func<T, string> conversion)
{
    // Do-whatchya-do
}

void Main()
{
    Read<SomeObj>(new SomeObj(), Conversions.UpperString<SomeObj>);
    Read<SomeObj>(new SomeObj(), Conversions.LowerString<SomeObj>);
}

最終的に「Read」を呼び出すときに、ジェネリック メソッドを正しい型で渡すだけで済みます。そのため、型シグネチャを少し複製する必要があるかもしれませんが、問題なく動作するはずです。

それらが拡張メソッドであることは何も変わりません。任意の拡張メソッドを非拡張形式で明示的に使用できます。例えば:

public static class Extensions 
{
    public static T SomeExtension<T>(this T value) { /* ... */ }
}

次の両方の方法で呼び出すことができます。

someT.SomeExtension();
Extensions.SomeExtension(someT);
于 2013-04-12T18:54:28.817 に答える