我需要能够做到这一点:
var getHed = () =>
{
// do stuff
return new { Property1 = value, Property2 = value2, etc...};
};
var anonymousClass = getHed();
但我得到一个错误,表明我需要明确声明getHed。
如何声明Func使得T是我要返回的匿名类型?
如果您好奇我为什么需要这样做,那是因为我使用的是允许自定义代码的第三方软件,但只能在一种方法中使用。这可能变得非常难以管理。我有一个想法,我可以使用匿名方法来帮助保持程序代码的组织。在这种情况下,为了帮助它,我需要一个新的类,除了匿名之外我无法定义。
答案 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)>
,而这只能通过类型推断来完成。
但是,类型推断和泛型参数要求该方法是通用的,因此需要额外的方法来帮助编译器执行此类推理的通用方法。
因为你需要留在一个方法中......