Можно ли определить свойство без какого-либо типа в C #?

#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> / или потребуется любая другая стратегия сравнения.