Ссылка универсального свойства в выражении - PullRequest
1 голос
/ 02 июня 2009

Допустим, у меня есть два стола, обед и ужин. Я знаю, что оба содержат свойство DateTime "Время".

Если у меня есть универсальный метод GetTime, как я могу вернуть db.Lunch.Time, когда T - Lunch, и db.Dinner.Time, когда T - Dinner? Я пытаюсь достичь этого, не тестируя T по отдельности, используя typeof, но достаточно обобщенно.

псевдокод: </p> <pre><code>public T GetTime<T>(DateTime dt) { return MyDataContext.GetTable<T>().Where(entity => entity.Time == dt); }

Поэтому, когда я вызываю GetTime , он автоматически ищет в таблице обедов все сущности ужина с временем свойства, равным моему предоставленному параметру dt.

Проблема в том, что я не могу указать entity.Time в моем выражении, потому что T является универсальным. Мой вопрос заключается в том, как обойти это, чтобы я мог искать любой T (зная, что все мои сущности на самом деле имеют свойство Time) без необходимости создавать специальные методы для Dinner и Lunch.

Ответы [ 3 ]

5 голосов
/ 02 июня 2009

Вам нужно, чтобы оба класса реализовывали интерфейс примерно так:

public interface IMyInterface
{
   DateTime Time{get;set;}
}

А потом по вашему универсальному методу:

public void MyMethod<T>(T item) where T: IMyInterface
{
    //here you can access item.Time
}
1 голос
/ 02 июня 2009

Вы можете использовать интерфейс, который реализует Lunch and Dinner, который имеет свойство Time

 public interface IMealTime
    {
        DateTime Time { get; set; }
    }

    public class Lunch : IMealTime
    {
        #region IMealTime Members

        public DateTime Time { get; set; }

        #endregion
    }

    public class Dinner : IMealTime
    {
        #region IMealTime Members
        public DateTime Time { get; set; }

        #endregion
    }

    public class GenericMeal
    {
        public DateTime GetMealTime<T>(T meal) where T: IMealTime
        {
            return meal.Time;
        }
    }
0 голосов
/ 02 июня 2009

Вы всегда можете использовать отражение, конечно. Кроме того, если два типа реализуют общий интерфейс со свойством Lunch, вы можете использовать это. (Я не понимаю, что вы подразумеваете здесь под «Таблицей».)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...