C # вопрос о том, что означает этот код - PullRequest
1 голос
/ 01 октября 2010

Я изучаю код C # из одного из приложений, из которых я запускаю SQL-запросы.

Мне интересно, что следующий код делает в терминах непрофессионала:

  return typeof(ViewModelBase<T>).GetProperty(propertyName) != null;

Это вфункция, которая возвращает логическое значение и в него передается строка.

ViewModelBase<T> - абстрактный класс.Может кто-то также объяснить, что <T> делает в этом?У меня есть идеи по этому поводу, но я не уверен, что именно так.

Спасибо!

Ответы [ 4 ]

4 голосов
/ 01 октября 2010

Код возвращает true, если тип имеет свойство, и false, если его нет.

Этот код будет написан внутри обобщенного класса с параметром типа T. В обобщенных случаях каждый раз, когда «обобщенный» тип используется с обобщенным классом, компилятор создает новый конкретный тип. Так, например, если бы в вашем проекте был код, который использовал ViewModelBase<int>, ViewModelBase<string> и ViewModelBase<MyType>, в окончательной сборке компилятором было бы три конкретных типа.

Каждый из этих трех гипотетических типов будет иметь свойства и методы. Приведенный выше код (для всех намерений и целей) будет продублирован три раза, а параметр типа "T" будет заменен на int, string и MyType в каждом из трех случаев.

GetProperty() затем проверит, имеет ли конкретный тип свойство, указанное в переменной «propertyName», и вернет соответственно true или false.

3 голосов
/ 01 октября 2010

Здесь указывается, имеет ли тип класса ViewModelBase<T>, основанный на заданном типе T, открытое свойство с тем же именем, что и значение propertyName.

Type.GetProperty() возвращает объект PropertyInfo, если есть такое свойство; в противном случае Отсюда логическое сравнение с нулем.

1 голос
/ 01 октября 2010

Кусок кода, который у вас есть, является частью универсального типа с аргументом типа T. Теперь мы не видим полный метод, но я могу представить, что он выглядит примерно так:

public static bool T HasProperty<T>(string propertyName)
{
    return typeof(ViewModelBase<T>).GetProperty(propertyName) != null;
}

Допустим, у вас есть класс Customer:

class Customer
{
    // implementation of class Customer goes here
}

Тогда вы могли бы вызвать метод HasProperty следующим образом:

bool itsThere = HasProperty<Customer>("SomePropertyName");

Это означает, что метод HasProperty вернет true, если ViewModelBase<Customer> имеет свойство с именем SomePropertyName, в противном случае false.

0 голосов
/ 01 октября 2010

Проверяет, есть ли у ViewModelBase<T> свойство с именем, равным propertyName.

...