у меня есть:Использование TypeOf в лямбда-выражения
CustomObjekt temp = myCustomList.Find(x => typeof(x.myTyp) is T)
Это синтаксически не правильно, что бы это было правильно?
у меня есть:Использование TypeOf в лямбда-выражения
CustomObjekt temp = myCustomList.Find(x => typeof(x.myTyp) is T)
Это синтаксически не правильно, что бы это было правильно?
Вы можете использовать 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));
Но 'typeof (x.myTyp)' не будет компилировать O_o –
И что-то вроде 'typeof (" ")' тоже не будет компилироваться ... 'typeof (x.myTyp)' абсолютно неверно, не так ли? –
@ MatíasFidemraizer: должен работать сейчас. –
Это либо неверно в лямбдах, делегатах или где угодно.
Оператор 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
.
Вы можете использовать GetType(), как это:
CustomObjekt temp = myCustomList.Find(x => x.myTyp.GetType() == typeof(T));
Спасибо, но 'x.myTyp' является динамическим, поэтому я не могу его использовать как вы писали. – kkkk00999
какой тип 'x.myTyp'? Нужно ли вам поддерживать наследование? (т. е. 'x.myTyp' может быть либо' T', либо ** наследовать от ** 'T'? –
hi,' x.myTyp' объявляется с 'dynamic', и обычно' x.myTyp' содержит значение 'typeof (AnyObject)' – kkkk00999