Как вы объявляете Func с анонимным типом возврата?
Мне нужно иметь возможность сделать это:
var getHed = () =>
{
// do stuff
return new { Property1 = value, Property2 = value2, etc...};
};
var anonymousClass = getHed();
Но я получаю сообщение об ошибке, которое указывает, что мне нужно явно объявить getHed.
Как объявить Func таким образом, что T - анонимный тип, который я возвращаю?
Если вам интересно, зачем мне это нужно, это потому, что я использую стороннее программное обеспечение, которое позволяет настраивать код, но только в рамках одного метода. Это может стать очень трудным для управления. У меня возникла идея, что я могу использовать анонимные методы, чтобы поддерживать организованный процедурный код. В этом случае для этого мне нужен новый класс, который я не могу определить, кроме анонимного.
Ответы
Ответ 1
Как это обычно бывает с анонимными типами, решение заключается в использовании общего метода, так что вы можете использовать вывод типа метода:
public static Func<TResult> DefineFunc<TResult>(Func<TResult> func)
{
return func;
}
Теперь вы можете написать:
var getHed = DefineFunc(() =>
{
// do stuff
return new { Property1 = value, Property2 = value2, etc...};
});
Ответ 2
Используйте следующий общий метод, чтобы дать компилятору вывод анонимного типа:
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;
Ответ 3
Короче говоря, это невозможно.
Вам нужен дополнительный универсальный метод, чтобы обмануть компилятор, чтобы вывести T
для анонимного типа, например, другие ответы здесь.
Однако, поскольку вы написали, что это особый случай, когда все должно вписываться в один метод, тогда нет, это невозможно.
Компилятор не разрешает этот синтаксис:
var x = () => ...
Он нуждается в этом:
DelegateType x = () => ...
Таким образом, вам нужно обмануть компилятор для разработки правильного типа для DelegateType
, который, вероятно, имеет значение Func<(anonymous type here)>
, и это может быть сделано только через вывод типа.
Однако параметры вывода типа и общие параметры требуют, чтобы метод был общим, и, следовательно, необходимость в дополнительном методе, который должен быть общим методом, чтобы помочь компилятору выполнить этот тип вывода.
Так как вам нужно оставаться внутри одного метода...