Добавление нескольких делегатов в Func <T>и возвращение результата первого лямбда-делегата (C #)? - PullRequest
1 голос
/ 30 июня 2011

Я хочу добавить лямбда-функцию к Func<T>.Кроме того, я хотел бы, чтобы возвращаемое значение было значением первого лямбда-делегата (я не могу изначально изменить порядок, в котором первое всегда будет применяться первым).Когда я пытаюсь сделать это с синтаксисом +=, я получаю следующее:

Ошибка 44 Оператор '+ =' не может быть применен к операндам типа 'System.Func<TEntity>' и 'лямбда-выражения'

Как мне достичь вышеуказанного?Я действительно хотел бы избежать использования традиционного синтаксиса делегатов, если это возможно.

class Transaction
{
    static Func<TEntity> ifNullInitializeWithThisReturnedObject = () => default(TEntity);

    public static bool IsDirty { get; private set; }

    public init (Func<TEntity> IfNullInitializeWithThisReturnedObject)
    {
         ifNullInitializeWithThisReturnedObject = IfNullInitializeWithThisReturnedObject;
    }
    public void somemethod()
    {
        ifNullInitializeWithThisReturnedObject += () => 
        { 
            IsDirty = true; 
            return default( TEntity ); 
        };
    }
}

Ответы [ 4 ]

3 голосов
/ 30 июня 2011

Почему бы не использовать традиционный синтаксис делегата, а затем явно получить список вызовов? Например:

delegate int fdelegate();

var f1 = new Func<int>(() => { return 1; });
var f2 = new Func<int>(() => { return 2; });

var f1d = new fdelegate(f1);
var f2d = new fdelegate(f2);
fdelegate f = f1d;
f += f2d;

int returnValue;
bool first = true;
foreach (var x in f.GetInvocationList())
{
    if (first)
    {
        returnValue = ((fdelegate)x)();
        first = false;
    }
    else
    {
        ((fdelegate)x)();
    }
}
1 голос
/ 30 июня 2011

Звучит так, будто вы пытаетесь использовать лямбду в качестве делегата многоадресной рассылки, но это не то, чем она является.

См. Этот вопрос StackOverlflow: Использование многоадресной рассылки в C # многоадресных делегатах

Я бы посоветовал либо вернуться к использованию синтаксиса делегата, например: http://msdn.microsoft.com/en-us/library/ms173175(v=vs.80).aspx,, либо использовать List<Func<TEntity>>.

1 голос
/ 30 июня 2011

+ = для событий. Вы хотите список >. Учитывая такой список, вы можете сделать это:

// funcList is an IEnumerable<Func<TEntity>> we got somehow
bool firstTime = true;
TEntity result;
foreach (f in funcList)
{
    if (firstTime)
        result = f();
    else
        f();
    firstTime = false;
}
return result;
0 голосов
/ 30 июня 2011

Что если вы создали коллекцию: List<Func<TEntity>>?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...