2016-04-06 2 views
0

у меня есть:Использование TypeOf в лямбда-выражения

CustomObjekt temp = myCustomList.Find(x => typeof(x.myTyp) is T) 

Это синтаксически не правильно, что бы это было правильно?

+1

какой тип 'x.myTyp'? Нужно ли вам поддерживать наследование? (т. е. 'x.myTyp' может быть либо' T', либо ** наследовать от ** 'T'? –

+0

hi,' x.myTyp' объявляется с 'dynamic', и обычно' x.myTyp' содержит значение 'typeof (AnyObject)' – kkkk00999

ответ

2

Вы можете использовать Enumerable.OfType и FirstOrdefault:

CustomObjekt temp = myCustomList.OfType<CustomObjekt>().FirstOrDefault(); 

Если сам объект не этого типа, но вы должны проверить тип свойства, используйте Where:

CustomObjekt temp = myCustomList.Where(x => x.myTyp.GetType() == typeof(T)).FirstOrDefault(); 

Если это a List<T> Вы также можете заменить Where...FirstOrdefault() на myCustomList.Find.

CustomObjekt temp = myCustomList.Find(x => x.myTyp.GetType() == typeof(T)); 
+2

Но 'typeof (x.myTyp)' не будет компилировать O_o –

+2

И что-то вроде 'typeof (" ")' тоже не будет компилироваться ... 'typeof (x.myTyp)' абсолютно неверно, не так ли? –

+0

@ MatíasFidemraizer: должен работать сейчас. –

0

Это либо неверно в лямбдах, делегатах или где угодно.

Оператор typeof должен получить экземпляр Type от данного идентификатора типа. Например, typeof(string).

В вашем случае, вам нужно использовать Type.IsAssignableFrom:

CustomObjekt temp = myCustomList.Find(x => typeof(T).IsAssignableFrom(x.myTyp)); 

Type.IsAssignableFrom имеет преимущество над someType == typeof(T): он принимает наследство в счете. Это самое близкое решение для оператора is, поскольку выражение is также дает true, если B is A, если B наследует A.

0

Вы можете использовать GetType(), как это:

CustomObjekt temp = myCustomList.Find(x => x.myTyp.GetType() == typeof(T)); 
+0

Спасибо, но 'x.myTyp' является динамическим, поэтому я не могу его использовать как вы писали. – kkkk00999

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