2016-04-05 2 views
1

позволяет сказать, что у меня есть следующий класс курса:Generic делегат

class Course 
    { 
     internal Student myStudent { get; set; } 
     internal string Name { get; set; } 

     public override string ToString() 
     { 
      return string.Format("{0, -5} {1, -15} {2}", Name, myStudent.Name, string.Join(" ", myStudent.Grade)); 
     } 
     internal class Student 
     { 
      internal string Name { get; set; } 
      internal List<int?> Grade { get; set; } 
     } 
    } 

и я хочу в основном использования в универсальном делегатом, один раз для междунар и один раз для строки:

SomeDelegate<string> d1 = new SomeDelegate<string>(course => course.Name); 
SomeDelegate<int> d2 = new SomeDelegate<int>(course => (int)course.myStudent.Grade.DefaultIfEmpty(null).Average()); 

Общий делегат:

delegate T SomeDelegate<T>(T param); 

, но я получаю ошибки.

строка не содержит определение для 'Имя' ....

Почему?

Спасибо!

+1

'T' является как тип аргумента и тип возвращаемого делегата, поэтому в 'd1',' course' является 'string' (и в' d2', это 'int'). Вероятно, вы захотите использовать 'Func ' (и 'Func '). –

ответ

4

Ваше определение делегата требует, чтобы тип входного параметра и выходного файла были одинаковыми. В вашем случае вы пытаетесь передать объект с свойством Name и вернуть строку, которая нарушает подпись вашего делегата.

Изменение делегата

delegate TOut SomeDelegate<TIn, TOut>(Tin param); 

или использовать встроенный в Func delegates.

1

Возможно, вам понадобится пара делегатов. Проблема здесь в том, что мы имеем два случая использования вы хотели использовать:

delegate T SomeDelegate<T>(T param); 

Выше простой делегат, который означает, что вы передаете в T, а не лямбда, который возвращает T. В этом случае вы могли бы назвать это так: new SomeDelegate<string>(course.Name)

delegate T SomeDelegate<T>(Func<T> param); 

Выше чуть более сложный делегат, который означает, что вы передаете в функцию, которая принимает значение T, когда это делается. Лямбда очень хорошо справляется с этим. В этом случае вы могли бы назвать это так: new SomeDelegate<string>(course => course.Name)

Вы можете прочитать больше о лямбды, выражений и т.д. здесь: https://msdn.microsoft.com/en-us/library/bb397687.aspx

Смежные вопросы