2013-03-25 54 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

将来,请将代码添加为* text *而不是截图。 – 2013-03-25 08:03:01

+0

@Jon我现在做了..谢谢 – 2013-03-25 08:20:20

+0

'CalcAge'的计算是错误的:( – leppie 2013-03-25 08:22:59

回答

3

我不相信你可以。我强烈建议您创建一个名为类型的新的。它看起来像你知道你想创建的所有属性和方法 - 所以只需创建一个Person类型。 ExpandoObject在某些情况下很有用,但不要指望它能够处理所有事情。

如果你真的想用这个功能的动态对象,你需要从DynamicObject派生类来代替 - 这样你可以实施超载,如果你想(通过拦截方法调用)。

+0

Jon Skeet!我知道这是一个旧的帖子,我希望你看到这个:-)你可能知道一个图书馆有像ExpandoObject,并允许重载的方法?如果我自己实现这个,我应该如何实现方法解析(假设我想模仿C#的行为)?谢谢。 – 2015-02-15 23:54:53

+1

@AK_:不,我不知道任何事情,恐怕。实现C#重载规则会很难* - 这里有很多复杂的东西。 – 2015-02-16 06:48:05