2014-01-23 65 views
0

我很難解釋我正在嘗試做什麼。可能有一個名字,但我不知道它是什麼。 首先,我有一個模型,如:用模型對象替換Html中的佔位符

public class Customer 
    { 
    public int Id { get; set; } 
    public int ProductId { get; set; } 
    ...more properties... 

    public virtual Product Product { get; set; } 
    } 
    public class Product 
    { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    ...more properties... 

    } 

其次,我有HTML文本與{}佔位符的字符串。我想有類似{Id}的東西,並用模型屬性替換Html文本。

<格> <跨度>名稱</SPAN > <跨度> {ID} - {} Product.Name </SPAN > </DIV >

我的想法是使用的NameValueCollection以模型屬性作爲字符串。使用反射,我可以做到這一點的基本屬性,但不是像Product.Name

我該怎麼做呢?我可以使用什麼來獲得NameValueCollection,我可以循環並替換Html?

下面是當前代碼我有(跳過虛擬財產):

public virtual NameValueCollection GetNameValueCollection(Object obj) 
{ 
    Type type = obj.GetType(); 
    PropertyInfo[] properties = type.GetProperties(); 
    var coll = new NameValueCollection(); 
    foreach (PropertyInfo property in properties) 
    { 
    if(!property.GetGetMethod().IsVirtual) 
    { 
     if (property.PropertyType == typeof(DateTime)) 
     { 
     var date = (DateTime)property.GetValue(obj, null); 
     coll.Add(property.Name, date.ToLongDateString()); 
     } 
     else if (property.PropertyType == typeof(DateTime?)) 
     { 
     var date = (DateTime?)property.GetValue(obj, null); 
     if (date.HasValue) 
     { 
      coll.Add(property.Name, date.Value.ToLongDateString()); 
     } 
     else 
     { 
      coll.Add(property.Name, string.Empty); 
     } 
     } 
     else 
     { 
     var value = property.GetValue(obj, null); 
     if (value != null) 
     { 
      coll.Add(property.Name, value.ToString()); 
     } 
     } 
    } 
    } 
    return coll; 
} 

這應該是遞歸的,但似乎應該有一個更好的辦法。順便說一下,我並不需要NameValueCollection(例如,可能是Dictionary<string,string>)。思考?是否有nuget包已經這樣做?

回答

0

我結束了剛剛使用我所做的,並添加了子部分來處理子對象。我不想做完整的遞歸,因爲我只想要直接的子對象,而不是通過鏈的所有方式。