Как я могу передать метод void, возвращающий расширение динамическому методу возврата? - PullRequest
4 голосов
/ 06 сентября 2011

Я хочу передать метод расширения, который возвращает void в качестве параметра, другому методу расширения, который возвращает динамический.

public static void AddTo(this Object entity, Object parent)
{
    parent.GetCollectionOf(entity).Add(entity);
}
public static dynamic And(this Object entity, Action method)
{
    entity.method(parent);
    return entity;
}

Я хотел бы использовать его примерно так:

dynamic parent = MakeNew(parentType);    
dynamic entity = MakeNew(type).And(AddTo(parent));

Мне нравится передавать любой метод void в And(), но все равно возвращать объект, который он расширил.Я надеюсь, что динамический тип возврата не является проблематичным.

Какой синтаксис для такого рода вещей?

Ответы [ 4 ]

2 голосов
/ 06 сентября 2011

Я правильно понял ваш вопрос?

dynamic entity = MakeNew(type).And(() => 
{
  AddTo(parent); 
}); 
1 голос
/ 05 июня 2012

Не могли бы вы, вероятно, сделать это так?

myObjects
        .Where(d => d.true == true && d.Value == 77)
        .Update(e => { e.Value = 1; e.true = false; } );

Используйте мой linq осторожно, он может взорваться в любой момент; -)

    /// <summary>
    /// Used to modify properties of an object returned from a LINQ query
    /// </summary>
    /// <typeparam name="TSource">The type of the source.</typeparam>
    /// <param name="input">The source</param>
    /// <param name="updater">The action to perform.</param>
    public static TSource Update<TSource>(this TSource input, Action<TSource> updater)
    {
        if (!updater.IsNull() && !input.IsNull())
        {
            updater(input);
        }
        return input;
    }

Чтобы объяснить это полностью:

    public DataRow DoSomething(DataRow dataRow)
    {
        //DoSomething
        return dataRow;
    }

    var query = from dataRow in myDataTable.Rows.Cast<DataRow>()
                where
                    Double.TryParse(dataRow["Distance"].ToString(), out distance)
                    && distance > (11) && distance <= 99
                select dataRow.Update(f => DoSomething(f));
0 голосов
/ 06 сентября 2011

Я думаю, что C # еще недостаточно "динамичен", чтобы делать то, что, я думаю, вам нужно.

Метод And не будет работать, поскольку параметр entity имеет тип object,так что entity.method(parent) не будет работать.Даже если вы определили entity как тип dynamic, C # попытается найти метод с именем «method» для вызова.Вы можете сделать это в вашем примере:

public static dynamic And(this Object entity, Action method, object parameter) 
{     
      method(entity, parameter);     
      return entity; 
}

и

dynamic entity = MakeNew(type).And(AddTo, parameter); 
0 голосов
/ 06 сентября 2011

Я подозреваю, что вы на самом деле хотите этого:

public static void AddTo(this Object entity, Object parent)
{
    parent.GetCollectionOf(entity).Add(entity);
}

public static dynamic And(this Object entity, Action<object> method)
{
    method(entity);
    return entity;
}

dynamic entity = MakeNew(type).And(entity => entity.AddTo(parent));

Сказав это, все еще неясно, откуда взялся parent, чтобы начать с ...

...