我很难解释我正在尝试做什么。它可能有一个名字,但我不知道它是什么。 首先,我有一个模型,如:
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文本。
< DIV><跨度>名称< /跨度><跨度> {ID} - {Product.Name}< /跨度>< / DIV>
我的想法是使用NameValueCollection将Model属性作为字符串。使用反射,我可以为基本属性执行此操作,但不能使用Product.Name
。
我是以错误的方式来做这件事的吗?我可以使用什么来获取我可以循环并替换Html的NameValueCollection?
这是我当前的代码(跳过虚拟属性):
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 :(得分:0)
我最后只使用了我所拥有的内容并添加了一个子部分来处理子对象。我不想做完整的递归,因为我只想要直接的子对象,而不是一直通过链。