如何使用匿名返回类型声明Func?
我需要能够做到这一点:
var getHed = () => { // do stuff return new { Property1 = value, Property2 = value2, etc...}; }; var anonymousClass = getHed();
但是我得到一个错误,表明我需要明确声明getHed。
如何声明Func使得T是我要返回的匿名类型?
如果你很好奇为什么我需要这样做,那是因为我使用第三方软件允许自定义代码,但只能在一个方法中使用。 这可能变得非常难以管理。 我有一个想法,我可以使用匿名方法来帮助保持程序代码的组织。 在这种情况下,为了帮助我,我需要一个新的类,除了匿名之外我无法定义。
正如匿名类型的情况基本上一样,解决方案是使用generics方法,以便您可以使用方法类型推断:
public static Func DefineFunc (Func func) { return func; }
你现在可以写:
var getHed = DefineFunc(() => { // do stuff return new { Property1 = value, Property2 = value2, etc...}; });
使用以下通用方法让编译器为您推断匿名类型:
public static Func MakeFn (Func f) { return f; }
用法:
var getHed = MakeFn(() => new { Property1 = ..., Property2 = ... }); var anonymousClass = getHed(); // you can now access Porperty1 and Property2 var test = anonymousClass.Porperty1;
简而言之,它无法完成。
您需要一个额外的通用方法来欺骗编译器推断出T
为您的匿名类型,例如此处提供的其他答案。
但是,既然你已经写过这是一个特殊情况,其中所有东西都必须适合单个方法,那么不,它就无法完成。
编译器不允许这种语法:
var x = () => ...
它需要这个:
DelegateType x = () => ...
因此,您需要欺骗编译器为DelegateType
正确的类型,这可能是Func<(anonymous type here)>
,这只能通过类型推断来完成。
但是,类型推断和generics参数要求该方法是通用的,因此需要一个必须是通用方法的附加方法来帮助编译器执行此类型推断。
因为你需要留在一个方法内……