如何从匿名类型检索强类型属性?
问题描述:
我使用匿名类型将类型化对象的集合传递给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”的方法来访问强类型属性。
你有两个选择:
- 盒/拆箱
- 硬着头皮如果你需要“解决”的来自多个来源的性质声明一个结构/类
,然后考虑使用OO抽象(接口/抽象类)的形式来传递类型。
虽然我同意这是一个简单的DTO风格类的好地方,但要小心说匿名类型只是本地的。情况并非完全如此。例如,您可以将实例传递给泛型方法。 – 2010-08-02 07:14:34
@Steven - 但是泛型方法接受什么样的“类型”?你在谈论接受类型'对象'的泛型委托方法吗? – RPM1984 2010-08-02 08:26:24
匿名类型与其他类型一样真实。它只是不能被名称引用。因此,例如,如果您有一个通用实用程序方法,它需要IEnumerable并返回MyList ,它会工作得很好。返回值必须保存在一个声明为var的变量中。 –
2010-08-02 13:20:22