web-dev-qa-db-ja.com

どのようにして匿名の戻り値型でFuncを宣言しますか?

私はこれを行うことができる必要があります:

var getHed = () => 
{
    // do stuff
    return new { Property1 = value, Property2 = value2, etc...};
};

var anonymousClass = getHed();

しかし、getHedを明示的に宣言する必要があることを示すエラーが表示されます。

Tが返される匿名型になるようにFuncを宣言するにはどうすればよいですか?

なぜ私がこれを行う必要があるのか​​気になる場合は、カスタマイズコードを許可するサードパーティのソフトウェアを使用しているためです。これは管理が非常に困難になる可能性があります。手続き型コードを整理しておくのに役立つ匿名メソッドを使用できると考えていました。この場合、それを支援するために、匿名でない限り定義できない新しいクラスが必要です。

26
Price Jones

基本的に常に匿名型の場合と同様に、解決策はジェネリックメソッドを使用することです。これにより、メソッドタイプの推論を使用できます。

public static Func<TResult> DefineFunc<TResult>(Func<TResult> func)
{
    return func;
}

あなたは今書くことができます:

var getHed = DefineFunc(() => 
{
    // do stuff
    return new { Property1 = value, Property2 = value2, etc...};
});
22
Servy

次のジェネリックメソッドを使用して、コンパイラーが匿名タイプを推測できるようにします。

public static Func<T> MakeFn<T>(Func<T> f)
{
    return f;
}

使用法:

var getHed = MakeFn(() => new { Property1 = ..., Property2 = ... });
var anonymousClass = getHed();

// you can now access Porperty1 and Property2
var test = anonymousClass.Porperty1;
9
haim770

つまり、それはできません。

ここで提供する他の回答のように、コンパイラーをだましてTを匿名型に推測させる追加の汎用メソッドが必要です。

ただし、これはすべてが1つのメソッド内に収まる必要がある特殊なケースであると書いたので、できません。

コンパイラはこの構文を許可しません:

_var x = () => ...
_

これが必要です:

_DelegateType x = () => ...
_

そのため、コンパイラをだましてDelegateTypeの正しい型を計算する必要があります。これはおそらくFunc<(anonymous type here)>であり、これは型の推論によってのみ実行できます。

ただし、型推論とジェネリックパラメーターでは、メソッドがジェネリックである必要があるため、コンパイラーがこの型推論を行うためにジェネリックメソッドである必要がある追加のメソッドが必要です。

1つのメソッド内にとどまる必要があるので...