#c# #.net #properties
#c# #.net #свойства
Вопрос:
У меня есть три модели, которые наследуются от модели B, каждая из которых имеет вызываемое свойство Id
, которое отличается для каждого типа.
public class BaseModel
{
string createTime;
}
public class IntValue:Base
{
int Id;
}
public class LongValue:Base
{
long Id;
}
public class ShortValue:Base
{
short Id;
}
Теперь я хочу написать универсальную функцию, которая выполняет специальные операции над образцами на основе этих трех моделей. В этой операции я буду сравнивать свойство Id
с другим параметром, определенным как ввод функции. Итак, мне пришлось определить три общие функции и провести это сравнение в каждой из них. Есть ли способ превратить эти три общие функции в одну функцию?
Могу ли я определить Id
без какого-либо типа в BaseModel?
public void Get<T> (List<T> items,List<int> requestItem)where T : IntValue
{
//Do Something ...
items.where(x=> requestItem.Contains(x.id))
//Do Something ...
}
public void Get<T> (List<T> items,List<long> requestItem)where T : LongValue
{
//Do Something ...
items.where(x=> requestItem.Contains(x.id))
//Do Something ...
}
public void Get<T> (List<T> items,List<short> requestItem)where T : ShortValue
{
//Do Something ...
items.where(x=> requestItem.Contains(x.id))
//Do Something ...
}
Комментарии:
1. Вы можете создать
BaseModel
generic (BaseModel<T>
) и создать свойствоId
типаT
2. Итак, как я могу справиться с этим
items.where(x=> requestItem.Contains(x.id))
, можете ли вы объяснить свой ответ?
Ответ №1:
Если я правильно понимаю, вы можете сделать что-то вроде:
public class BaseModel<T>
{
string createTime;
T Id;
public void Get (List<T> items, List<T> requestItem)
{
//Do Something ...
items.where(x => requestItem.Contains(x.id))
//Do Something ...
}
}
Тогда вам нужно будет наследовать только BaseModel
с правильным общим аргументом:
public class ShortValue: BaseModel<short>
{
}
Имейте в виду, что это может не сработать для типов, не содержащих значений, и IEqualityComparer<T>
/ или потребуется любая другая стратегия сравнения.