Как написать метод с параметром делегата в C # / .NET 4.0? - PullRequest
6 голосов
/ 27 апреля 2011

Я использовал способ объявления делегата на уровне класса:

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 ]

12 голосов
/ 27 апреля 2011

.NET теперь предоставляет обобщенные значения Action и Func для этой цели.

В вашем случае этот делегат не принимает параметров и ничего не возвращает.

// 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
                             )
5 голосов
/ 27 апреля 2011

Вы можете использовать общие 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...