如何使用匿名返回类型声明Func?

Pri*_*nes 25 c# anonymous-types anonymous-function

我需要能够做到这一点:

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

var anonymousClass = getHed();
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误,表明我需要明确声明getHed.

如何声明Func使得T是我要返回的匿名类型?

如果你好奇我为什么需要这样做,那是因为我使用第三方软件允许自定义代码,但只能在一个方法中使用.这可能变得非常难以管理.我有一个想法,我可以使用匿名方法来帮助保持程序代码的组织.在这种情况下,为了帮助它,我需要一个新类,除了匿名之外我无法定义.

Ser*_*rvy 22

正如匿名类型的情况基本上一样,解决方案是使用泛型方法,以便您可以使用方法类型推断:

public static Func<TResult> DefineFunc<TResult>(Func<TResult> func)
{
    return func;
}
Run Code Online (Sandbox Code Playgroud)

你现在可以写:

var getHed = DefineFunc(() => 
{
    // do stuff
    return new { Property1 = value, Property2 = value2, etc...};
});
Run Code Online (Sandbox Code Playgroud)

  • 最有名的是[`Linq.Func`](http://tomasp.net/blog/dynamic-linq-queries.aspx/)辅助方法. (3认同)

hai*_*770 9

使用以下泛型方法让编译器为您推断匿名类型:

public static Func<T> MakeFn<T>(Func<T> f)
{
    return f;
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

// you can now access Porperty1 and Property2
var test = anonymousClass.Porperty1;
Run Code Online (Sandbox Code Playgroud)