我一直在使用我在课堂级别声明委托的方式:
protected delegate void FieldsDelegate();
//and then write a method e.g.
protected int CreateComponent(DbConnection cnctn, string tableName, Dictionary<string, object> changedFieldValues, FieldsDelegate fieldsDelegate)
然而,这真的很麻烦,我无法立即看到代表是什么样的。所以我想这样做:
protected int CreateComponent(DbConnection cnctn, string tableName, Dictionary<string, object> changedFieldValues, delegate void fieldsDelegate())
所以我没有单独的定义。
由于某种原因,不允许上述内容。那我怎么能这样做呢?
答案 0 :(得分:12)
在您的情况下,此委托不接受任何参数并且不返回任何内容。
// protected delegate void FieldsDelegate(); // Don't need this anymore
protected int CreateComponent(
DbConnection cnctn,
string tableName,
Dictionary<string, object> changedFieldValues,
Action fieldsDelegate
)
如果它将一个字符串作为参数:
// protected delegate void FieldsDelegate(string s);
protected int CreateComponent(
DbConnection cnctn,
string tableName,
Dictionary<string, object> changedFieldValues,
Action<string> fieldsDelegate
)
如果它将一个字符串作为参数并返回一个bool:
// protected delegate bool FieldsDelegate(string s);
protected int CreateComponent(
DbConnection cnctn,
string tableName,
Dictionary<string, object> changedFieldValues,
Func<string, bool> fieldsDelegate
)
答案 1 :(得分:5)
您可以使用通用Action<T>
和Func<T>
及其变体作为代理人,奖金是您根本不需要定义单独的委托。
Action<T>
最多可使用16种不同的类型参数,因此:Action<T1, T2>
并且在上;每个类型参数都是相同位置的方法的类型参数。因此,Action<int, string>
适用于此方法:
public void MyMethod(int number, string info)
Func<T>
是相同的,除了它是返回值的方法。最后一个类型参数是返回类型。 Func<T>
不是您在此处使用的内容。
示例:Func<string, int, object>
适用于以下方法:
public object MyOtherMethod(string message, int number)
使用这些泛型委托可以清楚说明该委托参数的参数是什么,这似乎是你的意图。
public void MyMethod(Action<string, MyClass>, string message)
调用该方法,您知道需要传递一个方法,其中包含string
和MyClass
。
public void MeOtherMethod(Func<int, MyOtherClass>, int iterations)
在这里,您知道需要传递一个采用int
参数的方法,并返回MyOtherClass