有人可以帮我理解如何将所有参数传递给委托内部的委托吗?
我上课了:
public class ShopManager : ShopEntities
{
public ShopManager getWhere(Func<Object, Object> dataList)
{
var x = dataList.???; // how to get arguments?
return this;
}
public Object getLike(Object dataValue)
{
return dataValue;
}
}
然后我称之为:
ShopManager shopManager = new ShopManager()
var demo = shopManager.getWhere(xxx => shopManager.getLike("DATA"));
问题是:如何在方法getWhere()中传递参数“xxx”和“DATA”?
提前致谢。
答案 0 :(得分:5)
你不能,因为它是另一种方式。您不能获取参数,因为委托不持有它们;调用委托时,getWhere
方法需要传递 xxx
参数的值。然后,委托引用的匿名方法将接收此值作为xxx
参数,并在调用"DATA"
时将字符串dataValue
作为getLike
参数的参数传递。这样的参数值不是委托状态的一部分。
如果您想获取有关参数的信息(而不是它们的值),您可以这样做:
// get an array of ParameterInfo objects
var parameters = dataList.Method.GetParameters();
Console.WriteLine(parameters[0].Name); // prints "xxx"
答案 1 :(得分:2)
如果您使用:
public ShopManager getWhere(Expression<Func<Object, Object>> dataList)
然后你可以将Expression分成它的子表达式并解析它们。但我不确定像你这样使用代表是否是正确的事情。
答案 2 :(得分:1)
你不能(轻松)。但我不明白你的想法。您需要查看dataList
的原因是什么?这只是一个匿名方法,您可以调用它并获得结果,您根本不需要检查或修改它。
你的想法是什么?为什么不打电话给shopManager.getLike()
?
答案 3 :(得分:1)
您可以通过执行以下操作获取功能名称。
var x = dataList.GetInvocationList().FirstOrDefault().Method.GetParameters();
sring name = x.FirstOrDefault().Name
这会将名称打印为'xxx'
答案 4 :(得分:1)
参数是你在通过dataList(args)调用委托时提供的,而不是调用的接收者。如果您想为getWhere()提供其他信息,可以尝试以下方法....
public ShopManager getWhere(Func<Object, Object> dataList, params object[] additonalData)
{
// inspect the additionalData
}
答案 5 :(得分:0)
感谢回复家伙,我决定使用Expression&gt;而不是共同的代表。这样就可以得到表达的两面--LHS和RHS。
对于那些有兴趣回答的人,就是这样: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/0f6ca823-dbe6-4eb6-9dd4-6ee895fd07b5?prof=required
感谢您的耐心和关注。
答案 6 :(得分:-1)
public static List<object> GetMethodParameterValues(Delegate method)
{
var target = method.Target;
if (target == null) return null;
var fields = target.GetType().GetFields();
var valueList = fields.Select(field => field.GetValue(target)).ToList();
return valueList;
}