2014-08-29 3 views
0

Я хочу поместить Func, где T является общим типом, как значения в словаре. Так что в основном я хочу сделать что-то вроде:C# Словарь с Func <string, T> als values ​​

Dictionary<string, Func<MyObject, T>> _sortMappings = 
       new Dictionary<string, Func<MyObject, T>>() 
    { 
     { "Name", (b) => b.Name }, // name is a string    
     { "Length", (b) => b.Length }, // length is an int 
     { "Date", (b) => b.Date } // a datetime object 
    }; 

Имеет ли это смысл и это возможно?

+1

Это должно быть '' Func ? В строке '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. – SimpleVar

+0

Вы правы. Это объект пользовательского определенного класса. Исправлено. – staccata

+0

Вы попробовали мое решение? – faby

ответ

5

Невозможно с Func<MyObject, T> вам необходимо использовать Func<MyObject, object>. T не может быть более одного типа одновременно. Поэтому вам нужно найти общий тип для string, int и DateTime который object.

+0

Действительно, объект кажется способным, но я искал более элегантный способ без необходимости бокса/распаковки. Благодарю. – staccata

0

попробовать таким образом, используя Convert.ChangeType Method

"Name", b => (T)System.Convert.ChangeType(b.Name,typeof(T))

ваши функции должны быть

private static T InvokeFunction<T>(Func<T> func) 
    { 
     Dictionary<string, Func<MyObject, T>> sortMappings = 
     new Dictionary<string, Func<MyObject, T>>(); 
     sortMappings.Add("Name", b => (T)System.Convert.ChangeType(b.Name,typeof(T))); 
     sortMappings.Add("Length", b => (T)System.Convert.ChangeType(b.Length, typeof(T))); 
     sortMappings.Add("Date", b => (T)System.Convert.ChangeType(b.Date, typeof(T))); 
     return func.Invoke(); 
    } 
+0

, вероятно, вы получите 'InvalidCastException' с этим ... –

+0

@ Selman22 Я попробовал его и никаких ошибок не произошло – faby

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