如何从匿名类型检索强类型属性?

问题描述:

我使用匿名类型将类型化对象的集合传递给TemplateResolver,其中新实例化文本模板中的指定占位符可以从多个对象(例如,如何从匿名类型检索强类型属性?

var body = TemplateResolver.ResolveTemplate(template.ExternalRecipientBody, new {Sender = customer, NewJobCard = jobCard}); 

其中模板具有类似{Sender$Surname}{NewJobCard$JobNumber}占位符。

Inside ResolveTemplate我需要发件人和NewJobCard强类型,而不知道要投它们。

解决方案到目前为止

我想出了这个,到目前为止,但不必使用字符串成员的名字厌恶。我有asked another question关于以至少方法调用lmbda'ring字符串的可能性,即使不是方法体。

private T GetAnonymousTypeMember<T>(object anonymousType, string memberName) where T: class 
    { 
     var anonTypesType = anonymousType.GetType(); 
     var propInfo = anonTypesType.GetProperty(memberName); 
     return propInfo.GetValue(anonymousType, null) as T; 
    } 

匿名类型只有方法的范围,因此您将无法在“ResolveTemplate”的方法来访问强类型属性。

你有两个选择:

  1. 盒/拆箱
  2. 硬着头皮如果你需要“解决”的来自多个来源的性质声明一个结构/类

,然后考虑使用OO抽象(接口/抽象类)的形式来传递类型。

+0

虽然我同意这是一个简单的DTO风格类的好地方,但要小心说匿名类型只是本地的。情况并非完全如此。例如,您可以将实例传递给泛型方法。 – 2010-08-02 07:14:34

+0

@Steven - 但是泛型方法接受什么样的“类型”?你在谈论接受类型'对象'的泛型委托方法吗? – RPM1984 2010-08-02 08:26:24

+0

匿名类型与其他类型一样真实。它只是不能被名称引用。因此,例如,如果您有一个通用实用程序方法,它需要IEnumerable 并返回MyList ,它会工作得很好。返回值必须保存在一个声明为var的变量中。 – 2010-08-02 13:20:22