如何将void返回扩展方法传递给动态返回扩展方法?

时间:2011-09-06 13:29:28

标签: c# delegates extension-methods action func

我想传递一个扩展方法,该方法将void作为参数返回给另一个返回dynamic的扩展方法。

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 个答案:

答案 0 :(得分:2)

我的问题是否正确?

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

答案 1 :(得分:1)

你能这样做吗?

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));

答案 2 :(得分:0)

我怀疑你实际想要这个:

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从哪里开始......

答案 3 :(得分:0)

我认为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);