2015-09-25 127 views
2

我有一个WCF Web服务在一个返回对象的MVC4应用程序中使用。我想在加载后向对象添加另一个属性。基本上我想要一个克隆的对象加上我的新属性。将新属性添加到.Net对象

我该怎么做?

最好是反序列化为JSON,然后添加新属性,然后使用额外属性将其序列化到我的新对象中,或者有另一种方法来执行它?

+0

有关这方面的大量信息:http:// stackoverflow。com/questions/6329489/dynamic-add-properties-to-a-existing-object – HaukurHaf

+0

WPF是一个UI框架,WCF是一个Web服务框架,不要混淆。 – abatishchev

+0

创建您自己的类型,包括给定对象的所有属性以及您想要的新属性,然后填写您的新课程并按照您的要求进行操作。 –

回答

4

如果你想要让事情变得简单,你可以简单地创建新的类型,包括给定对象的所有属性和您所需的新属性,然后填写你的新班级,做你想要的东西。

另请考虑阅读注意部分。

对于复杂的案件和大的应用程序,你可以考虑像什么abatishchev mentioned in his answer解决方案。

class Foo 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 


class FooViewModel 
{ 
    public FooViewModel() 
    { 
    } 

    public FooViewModel(Foo foo) 
    { 
     this.Id= foo.Id; 
     this.Name= foo.Name; 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 

    public string NewProperty{ get; set; } 
} 

而且使用这种方式:

var foo = Service.GetFoo(); 
var fooViewModel= new FooViewModel(foo); 
fooViewModel.NewProperty = "new value"; 

注:

  • 可以在FooViewModel使用Foo实例和所有getter和setter作用于该实例保持件事同步。
  • 有时候您可以使用来自Foo的继承来增强解决方案,这样您不需要再次创建每个属性。
  • 对于复杂的案例和大型应用程序,您可以考虑类似abatishchev mentioned in his answer的解决方案。
+0

我同意它让事情变得简单,但是更进一步,您添加和删除的属性越多 - 它带来的麻烦越多。你可以忘记指定一个属性,并得到一个奇怪的错误。所以你创建一个单独的类来映射和单元测试它。什么是几乎相同的AutoMapper,但一切都是手动的,而不需要它。你回答的是我之前做的事情,我的回答就是我现在正在做的事情。 – abatishchev

+0

@abatishchev感谢您的评论。尽管我们可以使用继承来减少这种痛苦,但总的来说,你是对的。该选项适用于简单情况。 –

+1

是的,继承看起来很好的解决方案。但是,如果没有C#中的多重继承,您需要选择一次并明智地选择:)如果您有多个图层(数据访问,数据传输,业务逻辑,演示文稿),则无法继承。这里[组合继承](https://en.wikipedia.org/wiki/Composition_over_inheritance)将有助于您最终复制多个属性多次。之后 - 看看如何自动化这个。 – abatishchev

3

我认为你要找的是AutoMapper。您可以将一个对象映射到另一个。假设你有一个具有X属性的DTO实体。然后,您将拥有一个具有相同X属性+ Y附加值的业务逻辑实体。 AutoMapper将处理它easily

class OrderDto 
{ 
    public int OrderId { get; set; } 
} 

class OrderViewModel 
{ 
    public int OrderId { get; set; } 

    public int DisplayOrder { get; set; } 
} 

映射:

var dto = new OrderDto { OrderId = 2 }; 
var vm = mapper.Map<OrderViewModel>(dto); 
vm.DisplayOrder = 3; 
+0

特别适用于大型应用的不错选择+1 –

0

难道是最好的反序列化到JSON,然后添加新的特性和 然后将其与额外的属性序列化到我的新的对象或者是 有另一种方式做到这一点?

使用JSON肯定会更容易,成本更低。

但是,如果您想要更多地控制生成过程,请参阅that回答如何即时生成类。

+0

为什么在使用反射时使用JSON? – abatishchev