2013-03-25 3 views
0

Я следующий объект EXPANDOКак я могу перегрузить метод с помощью ExpandoObject?

dynamic person = new ExpandoObject(); 
     person.FirstName = " FirstName "; 
     person.SecondName = " FirstName "; 
     person.FullName = person.FirstName + person.SecondName; 
     person.BirthDate = new DateTime(1990, 1, 1); 

     person.CalcAge = (Func<int>) 
      (() => DateTime.Now.Year - person.BirthDate.Year); 

Я определяю CalcAge метод для расчета возраста .. Я хочу, чтобы добавить перегруженный метод, который имеет параметр как ниже

person.CalcAge = (Func<DateTime, int>) 
      ((DateTime date) => date.Year - person.BirthDate.Year); 

Как можно реализовать это с ExpandoObject, в котором я могу сделать ниже?

int age1 = person.CalcAge(); 
MessageBox.Show(age1.ToString()); 

int age2 = person.CalcAge2(new DateTime(1980, 1, 1)); 
MessageBox.Show(age2.ToString()); 
+2

В дальнейшем, пожалуйста, добавьте код как * текст *, а не скриншоты. –

+0

@Jon Я сделал это сейчас .. спасибо –

+0

Расчет для 'CalcAge' неверен :( – leppie

ответ

3

Я не верю, что вы можете. Я бы настоятельно рекомендовал вместо этого создать новый с именем. Похоже, вы знаете все свойства и методы, которые хотите создать, поэтому просто создайте тип Person. ExpandoObject полезен в некоторых сценариях, но не ожидайте, что он сможет справиться со всем.

Если вы действительно хотите динамический объект с этой функциональностью, вам необходимо получить класс из DynamicObject вместо этого - таким образом вы могли осуществить перегрузку, если вы хотите (перехватывать вызовы методов).

+0

Jon Skeet! Я знаю, что это старое сообщение, я надеюсь, вы видите это :-) Возможно, вы знаете о библиотеке, которая имеет что-то вроде ExpandoObject и позволяет перегружать методы? Если я сам реализую это, как мне подходить к внедрению разрешения метода (Предполагая, что я хочу подражать C#)? Спасибо. –

+1

@AK_: Нет, я ничего не знаю, боюсь. Реализация правил перегрузки C# будет * жесткой * - там много сложного материала. –