如何在C#/ .NET 4.0中编写带有delegate参数的方法?

时间:2011-04-27 09:34:06

标签: c# .net delegates

我一直在使用我在课堂级别声明委托的方式:

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

所以我没有单独的定义。

由于某种原因,不允许上述内容。那我怎么能这样做呢?

2 个答案:

答案 0 :(得分:12)

.NET现在为此提供了ActionFunc泛型。

在您的情况下,此委托不接受任何参数并且不返回任何内容。

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

调用该方法,您知道需要传递一个方法,其中包含stringMyClass

public void MeOtherMethod(Func<int, MyOtherClass>, int iterations)

在这里,您知道需要传递一个采用int参数的方法,并返回MyOtherClass