Прямой перевод вашего кода в предложение Linq, где:
string messageValue = "foo";
var result = baseList.Where(item =>
{
dynamic c = item;
if(item is MyFirstType || item is MySecondType)
{
if( c.SpecificValue == messageValue)
return true;
}
return false;
});
Это потребует тестирования типа класса, хотя и с использованием динамического - так что вы можете также привести приведениедля элемента MyFirstType
или MySecondType
напрямую.
В качестве альтернативы можно использовать отражение, чтобы проверить, существует ли свойство, используя этот подход, вы не зависите от фактических типов ваших элементов, пока ониУ вас есть интересующее вас свойство:
string messageValue = "foo";
var result = baseList.Where( item =>
{
var prop = item.GetType().GetProperty("SpecificValue");
if (prop != null && prop.GetValue(item, null) == messageValue)
return true;
else return false;
});
Если вы можете изменить иерархию классов, вы можете MyFirstType
или MySecondType
реализовать интерфейс, который содержит свойство, тогда вы можете использовать OfType()
в вашем запросе Linq:
interface ISpecific
{
string SpecificValue { get; set; }
}
class MyFirstType : MyBase, ISpecific
{
public string SpecificValue { get; set; }
}
...
string messageValue = "foo";
var result = baseList.OfType<ISpecific>()
.Where(item => item.SpecificValue == messageValue);