Могу ли я получить Type() связанного объекта в C#/WPF (даже если связанное значение равно null)?

У меня есть привязка к неизвестному источнику. Все, что у меня есть, это привязка. У меня нет другого способа взглянуть на связанный объект. Мне нужно выяснить тип связанного объекта, даже если значение равно null (вот где моя проблема).

Я оценивал привязку путем привязки к объекту, а затем использовал объект как способ получить тип, но мне нужно знать тип, даже если значение равно null.

Например, у меня есть такой класс:

public class Customer{
  public string Name { get; set; }
  public int Age { get; set; }
}

Теперь, если у меня есть элемент управления WPF, привязанный к любому из этих свойств (давайте предположим, что они являются свойствами зависимостей), я хотел бы получить тип свойства, даже если значение равно null.

Итак, у меня есть настраиваемый элемент управления, который теперь имеет объект Binding, представляющий, например, {Binding Name}. Как я могу получить тип «связанного объекта» с помощью С#?


person Phobis    schedule 23.08.2010    source источник


Ответы (3)


Готовы ли вы использовать отражение, чтобы получить доступ к закрытым членам? Если это так, я думаю, что Binding имеет внутренний метод с именем CreateBindingExpression, который возвращает BindingExpression, у которого есть частный член с именем _listener внутреннего типа PropertyPathListener. У него есть внутреннее свойство под названием LeafType, которое, как мне кажется, вам нужно.

Это запутанно, требует доверия и может дать сбой в будущих версиях Framework, но это может быть единственный способ получить то, что вы ищете.

person Gabe    schedule 23.08.2010
comment
Вау... Да, это так. Я не собираюсь этого делать. Похоже, я разрешаю привязку к свойству только путем установки строки свойства и исходного объекта. Спасибо хоть! :) - person Phobis; 23.08.2010
comment
+1, хотя вам не нужно прыгать через обручи, чтобы получить BindingExpression - просто используйте BindingOperations.GetBindingExpression. Однако оттуда вам, к сожалению, придется прибегнуть к отражению, чтобы определить тип исходного свойства. - person Kent Boogaart; 23.08.2010

Это должно быть просто делом

MyCustomControl.DataContext != null ? MyCustomControl.GetType() : default(Type);
person Steve Danner    schedule 23.08.2010
comment
У меня нет DataContext. В рамках моего оценочного кода у меня есть только Binding. Мне нужно получить тип объекта, на который указывает привязка (даже если значение равно null) - person Phobis; 23.08.2010

Если значение равно null, тип не может быть получен. Если привязка к статическому ресурсу, определенному в App.xaml, вам буквально придется проанализировать сам файл xaml, чтобы узнать тип, если он определен в классе, вам придется отразить его, чтобы узнать тип.

Если привязка выполняется в коде, я не думаю, что вы можете это сделать, потому что она может быть привязана к нулевой локальной переменной, которую вы даже не сможете отразить (или, может быть, вы можете, но это было бы слишком моя голова). Если привязка определена в xaml, вы можете рационально разобрать xaml и попытаться следовать пути xaml, анализируя другие файлы xaml и отражая любые свойства для привязок этого пути в код.

Это было бы огромной болью, и я почти уверен, какой бы ни была ваша конечная цель, можно было бы достичь без нелепого времени, которое потребовалось бы, если бы вы делали что-то другое, кроме попытки определить тип, даже если он был нулевым.

person Jimmy Hoffa    schedule 23.08.2010
comment
Я привязываюсь к свойству объекта. Я просто пытаюсь найти способ получить доступ к PropertyInfo связанного свойства (или что-то подобное). - person Phobis; 23.08.2010
comment
@Phobis: я не думал, что вы привязываетесь к свойству не-объекта, это просто вопрос того, как вы отслеживаете этот объект. Отслеживание его из xaml, а затем отражение типа для его свойств может быть выполнимо, но если привязка определена в коде, у вас может не быть никакого способа сделать это, кроме отражения, которое является пограничной декомпиляцией. - person Jimmy Hoffa; 23.08.2010