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

6

我一直在使用在类级别声明委托的方法:

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

为了避免单独定义,我希望能进行如上所述的操作。

由于某些原因,上述操作是不被允许的。那么我该怎么做呢?


实际上,FieldsDelegate 中的后缀 Delegate 已经是一个非常好的指示器了。 - H H
2个回答

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
                             )

如果它以字符串作为参数并返回布尔值:
// protected delegate bool FieldsDelegate(string s); 

protected int CreateComponent(
                               DbConnection cnctn, 
                               string tableName, 
                               Dictionary<string, object> changedFieldValues,
                               Func<string, bool> fieldsDelegate
                             )

@Henk - 我同意。如果我包括被代理的委托,那么它会更容易理解。 - Andrew Shepherd

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的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接