2014-12-29 5 views
0

ExpandoObject is Запечатанный, не может быть унаследован напрямую.Как переопределить ToString() для ExpandoObject в C#

EDIT2: Почему я использую ExpandoObject не DynamicObject, потому что ExpandoObject реализован INotifyPropertyChanged, который поддерживается в WPF. И в wpf, Control будет вызывать неявное ToString, упомянутое в System.Object, так что можно переопределить System.Object.ToString() для ExpandoObject?

Спасибо и извините за @Los Frijoles, я давно не выражал свой вопрос.

+3

Что вы подразумевали под * Но это потеряет чувство «динамического» *? –

+0

Если у меня 10 экземпляров экземпляра diff, и для каждого типа ToString() может потребоваться реализация diff, поэтому мне нужно создать подкласс 10-го класса? @Sriram Sakthivel –

ответ

1

Я не знаю, о «элегантный», но вы всегда можете попробовать это:

public delegate string ToStringFunc(); 

public static void Main(string[] args) 
{ 
    dynamic test = new ExpandoObject(); 

    test.ToString = new ToStringFunc(() => 
     { 
      return "Test"; 
     }); 

    Console.WriteLine(test.ToString()); 
} 

Это просто создает значение, называемое ToString, которое случается, функция делегат, который выглядит как обычный метод подписи для a ToString функция.

Это позволяет избежать необходимости расширения ExpandoObject или тому подобного и, похоже, поддерживает то, что я бы назвал «динамическим» чувством, позволяющим определить, как объект «появляется» только во время выполнения. Конечно, что именно означает «динамическое чувство», является полностью субъективным.

EDIT:

Вот версия, которая позволит неявной ToString упомянутых в комментариях с помощью DynamicObject, но все еще позволяя части возможности «Expando», данное ExpandoObject: https://gist.github.com/kcuzner/3670e78ae1707a0e959d

Это выходит за рамки того, что просил автор, но я подумал, что я включу его для тех, кто рассматривает этот ответ позже.

+0

Неявно ли он вызывается, если вы печатаете объект? – Blindy

+1

Нет. Если объект передается в 'System.Object' (что происходит, когда его просто печатают), вместо того, чтобы выполнять поиск свойств и возвращая наш новый метод, будет выполняться метод' ToString', родной для 'ExpandoObject' делегировать. Явным образом вызывая 'ToString' что-то, что знал компилятор, было' dynamic', он сначала выполнял поиск свойств. Если бы вы хотели, чтобы это неявно работало, я бы предположил (и это предположение), что нужно было бы переопределить 'ToString' в подклассе, и я не вижу способа обойти это. Я не играл достаточно с «динамикой», чтобы знать тонкости. –

+0

Спасибо, ваш ответ работает, и я допустил ошибку: 'ExpandoObject' ** запечатан **, не может быть расширен. PS: мы также можем изменить делегат ToStringFunc на 'Func ()' –

Смежные вопросы