我有一个类似的抽象类:
public abstract class PageObjectsBase
{
public abstract string FriendlyName { get; }
public abstract string PageObjectKeyPrefix { get; }
public abstract string CollectionProperty { get; }
}
一个派生自PageObjectsBase的类:
public class PageRatingList : PageObjectsBase
{
public IList<PageRating> PageRatings { get; set; }
public PageRatingList()
{
this.PageRatings = new List<PageRating>();
}
public override string CollectionProperty
{
get
{
var collectionProperty = typeof(PageRatingList).GetProperties().FirstOrDefault(p => p.Name == "PageRatings");
return (collectionProperty != null) ? collectionProperty.Name : string.Empty;
}
}
public override string FriendlyName
{
get
{
return "Page feedback/rating";
}
}
public override string PageObjectKeyPrefix
{
get
{
return "pagerating-";
}
}
}
PageRatingList.PageRatings持有以下集合的PageRating类:
public class PageRating : PageObjectBase
{
public int Score { get; set; }
public string Comment { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
PageRatingList存储在数据库中(EPiServer的动态数据存储,更具体地说是使用页面对象管理器)。我需要创建一些报告功能,实质上是加载从PageObjectBase派生的所有报告。在返回数据时,代码在编译时永远不会知道要加载什么类型的数据,所以我使用的是Reflection。在我的报告课中,我有:
//this gives me the right type
var type = Type.GetType("MyNameSpace.PageRatingList", true);
var startPageData = this._contentRepository.Get<PageData>(startPage);
PageObjectManager pageObjectManager = new PageObjectManager(startPageData);
//this loads the instances from the DB
var props = pageObjectManager.LoadAllMetaObjects()
.FirstOrDefault(o => o.StoreName == "Sigma.CitizensAdvice.Web.Business.CustomEntity.PageRatingList");
//this gives me 4 PropertyInfo objects (IList: PageRatings, string : CollectionProperty, string :FriendlyName, string : PageObjectKeyPrefix)
var properties = props.Value.GetType().GetProperties();
然后我可以使用:
遍历PropertyInfo对象 foreach (var property in properties)
{
//extract property value here
}
我遇到的问题是我无法弄清楚如何获取每个propertyinfo对象的值。另外,其中一个属性是类型List,我们再次知道T的类型直到运行时。所以我还需要一些逻辑来检查其中一个PropertyInfo对象是否为List类型,然后提供对List中每个属性的访问 - List属于PageRating类型。
有人可以帮忙吗?我过去并没有真正使用过反射,所以无论是对还是错,我都在试图通过它!
非常感谢 人
答案 0 :(得分:0)
我可能会误解这个问题,但我想你可能会使用这样的东西:
var props = new PageRatingList(); /*actual instanse of the object, in your case, i think "props.Value" */
var properties = typeof(PageRatingList).GetProperties();
foreach (var property in properties)
{
if (property.PropertyType == typeof(IList<PageRating>))
{
IList<PageRating> list = (IList<PageRating>)property.GetValue(props);
/* do */
}
else
{
object val = property.GetValue(props);
}
}
希望这有助于找到您的解决方案。