我想传递一个扩展方法,该方法将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()
,但仍然返回它扩展的对象。我希望动态返回类型没有问题。
这种事情的语法是什么?
答案 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);