我很難解釋我正在嘗試做什麼。可能有一個名字,但我不知道它是什麼。 首先,我有一個模型,如:用模型對象替換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包已經這樣做?