Подтвердить что ты не робот

Как вы объявляете Func с анонимным типом возврата?

Мне нужно иметь возможность сделать это:

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

var anonymousClass = getHed();

Но я получаю сообщение об ошибке, которое указывает, что мне нужно явно объявить getHed.

Как объявить Func таким образом, что T - анонимный тип, который я возвращаю?

Если вам интересно, зачем мне это нужно, это потому, что я использую стороннее программное обеспечение, которое позволяет настраивать код, но только в рамках одного метода. Это может стать очень трудным для управления. У меня возникла идея, что я могу использовать анонимные методы, чтобы поддерживать организованный процедурный код. В этом случае для этого мне нужен новый класс, который я не могу определить, кроме анонимного.

4b9b3361

Ответ 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)>, и это может быть сделано только через вывод типа.

Однако параметры вывода типа и общие параметры требуют, чтобы метод был общим, и, следовательно, необходимость в дополнительном методе, который должен быть общим методом, чтобы помочь компилятору выполнить этот тип вывода.

Так как вам нужно оставаться внутри одного метода...