Обобщения: доступ к свойству объекта с использованием ограничения «где T: класс» в обобщенном методе - PullRequest
0 голосов
/ 26 августа 2018

Я прошу прощения, если этот вопрос был рассмотрен в другом месте, но я еще не смог найти ответ на него.

В настоящее время я изучаю дженерики в C # и возился с передачей ссылки на дженерик на следующий метод, который имеет ограничение на аргумент типа

public static T GetProperty<T>(T obj) where T : class

В этом методе я хочу получить доступ к свойству Isbn класса Book (о котором я расскажу ниже), но не вижу, как этого добиться. Например. в теле метода GetProperty<T>(T obj) я хочу сделать что-то вроде:

public static T GetProperty<T>(T obj) where T : class
{
    // How to access the passed in generic object's properties?
    // E.g. passing in an object of type Book, which has a property 'Isbn',
    // how do I return obj.Isbn?
}

На данный момент метод GetProperty<T>(T obj) находится в классе с именем Utilities.

Я создал простой класс для тестирования:

public class Book
{
    public int Isbn { get; set; }
}

Я создаю новый экземпляр Book и задаю свойство Isbn:

Book book = new Book() { Isnb = 1234 };

Затем я вызываю метод GetProperty() следующим образом:

Utilities.GetProperty(book);

Спасибо за вашу помощь или любую ссылку, где я могу решить этот вопрос.

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Вы должны будете использовать отражение здесь, Я бы использовал T в качестве типа свойства (result) и добавил бы параметр propName

 public static T GetProperty<T>(Object obj,string propName) where T : class
    {
        return (T)src.GetType().GetProperty(propName).GetValue(obj, null);
    }
0 голосов
/ 26 августа 2018

Тип возврата должен быть таким же, как вы ожидаете

public static int? GetProperty<T>(T obj) where T : class
{
    bool isBook = (obj is Book);
    if(isBook)
    {
        var bookObj = (obj as Book);
        return ((bookObj != null) ? bookObj.Isbn : null);
    }
    return null;
}
0 голосов
/ 26 августа 2018

Ну, вы не можете, если не разыгрываете obj в Book что-то вроде

(obj as Book)?.Isbn

Да Отражение можно использовать, но, как указано выше, не уверен, зачем вам нужен универсальный метод в этом случае.

var property = typeof(T).GetProperties().Where(p => p.Name = "Isbn").Select(p => p).
return obj.GetType().GetProperty(property.Name).GetValue(obj, null); 
...