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

时间:2016-12-14 20:39:04

标签: c# anonymous-function anonymous-types

我需要能够做到这一点:

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

var anonymousClass = getHed();

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

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

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

3 个答案:

答案 0 :(得分:22)

与匿名类型基本上一样,解决方案是使用泛型方法,以便您可以使用方法类型推理:

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

您现在可以写:

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

答案 1 :(得分:9)

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

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;

答案 2 :(得分:3)

简而言之,它无法完成。

您需要一个额外的通用方法来欺骗编译器推断T以使您成为匿名类型,例如此处提供的其他答案。

但是,既然您已经写过这是一个特殊情况,其中所有内容都必须适合单个方法,那么不,它就无法完成。

编译器不允许这种语法:

var x = () => ...

它需要这个:

DelegateType x = () => ...

因此,您需要欺骗编译器为DelegateType设计正确的类型,这可能是Func<(anonymous type here)>,而这只能通过类型推断来完成。

但是,类型推断和泛型参数要求该方法是通用的,因此需要额外的方法来帮助编译器执行此类推理的通用方法。

因为你需要留在一个方法中......