2010-08-02 92 views
0

我使用匿名類型將類型化對象的集合傳遞給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; 
    } 

回答

1

匿名類型只有方法的範圍,因此您將無法在「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