2015-10-06 63 views
3
public class Generic 
{ 
    public object AnonObject {get;set;} 
    public string ObjectType {get;set;} 
} 


public class TypedObject 
{ 
    public string Name {get;set;} 
} 

是否有转换匿名财产AnonObject类中[通用]使用ServiceStack serialization或其他库[TypedObject]的一种方式。转换的通用对象类型的对象

例如理想情况下,我要寻找一个方法

TypedObject typed = generic.AnonObject.ConvertTo<TypedObject>(); 

TypedObject typed = generic.AnonObject As TypedOject; 

回答

1

您可以使用仍然使用ServiceStack的built-in Auto Mapping匿名之间的转换和类型的对象,但他们仍然必须具有相同的形状,例如:

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

var anon = new { Id = 1, Title = "Foo" }; 
var dto = anon.ConvertTo<Poco>(); 

dto.PrintDump(); 

打印出人口DTO:

{ 
    Id: 1, 
    Title: Foo 
} 

ToObjectDictionaryFromObjectDictionary扩展方法在尝试将松散类型的数据结构转换为类型化POCO时也很有用的,如:

var dto = new User 
{ 
    FirstName = "First", 
    LastName = "Last", 
    Car = new Car { Age = 10, Name = "ZCar" }, 
}; 

Dictionary<string,object> map = dtoUser.ToObjectDictionary(); 

User user = (User)map.FromObjectDictionary(typeof(User)); 

如果上面的选项是不够的另一个潜在的解决方案是序列化/反序列化对象为JSON,如:

var json = new { Id = 1, Title = "Foo" }.ToJson(); 
var dto = json.FromJson<Poco>(); 
+0

谢谢FromObjectDictionary和ToObjectDictionary工作了我。不知道为什么其他人不工作。 –

2

你试过ServiceStack的built-in Auto-Mapping的方法呢?

TypedObject typed = generic.AnonObject.To<TypedObject>(); 

TypedObject typed = generic.AnonObject.TranslateTo<TypedObject>(); 

TypedObject typed = generic.AnonObject.ConvertTo<TypedObject>(); 

TypedObject typed = new TypedObject(); 
typed.PopulateWith(generic.AnonObject);