我有一个通用方法,它将T列表作为参数.我试图根据接口类型获取某些数据,并仅填充列表中每个项目的属性,这些属性在接口中定义.
所以我的基本界面是:
public interface IStatusResult
{
int Status { get; set; }
string StatusName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有许多实现此接口的其他接口,我想用它来确定要检索的状态/状态名称键/值对:
public interface IROQStatusResult: IStatusResult { }
public interface IOrderStatusResult: IStatusResult { }
public interface IActivityStatusResult: IStatusResult { }
Run Code Online (Sandbox Code Playgroud)
最后,我在搜索结果类中实现了这个接口:
public class RecommendedOrderQuantitySearchResult:IROQStatusResult {
public int Id { get; set; }
public DateTime TargetDate { get; set; }
public int Status { get; set; }
public string StatusName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以一旦从Db获取List我想在Generic方法中设置状态名称:
public static List<T> PopulateStatusNames<T>(List<T> items) where T:class
{
Dictionary<int, string> statuses = new Dictionary<int, string>();
if (typeof(IROQStatusResult).IsAssignableFrom(typeof(T))) {
statuses = GlobalConstants.GetROQStatuses();
}
if (typeof(IOrderStatusResult).IsAssignableFrom(typeof(T))){
statuses = GlobalConstants.GetOrderStatuses();
}
foreach (var item in items)
{
item.StatusName = statuses[item.Status];
}
return items;
}
Run Code Online (Sandbox Code Playgroud)
目前,item.StatusName给我一个错误:物品没有财产StatusName
我该如何实现呢?
使用OfType,它将只返回那些可以安全地转换为类型的:
foreach (var item in items.OfType<IStatusResult>())
{
item.StatusName = statuses[item.Status];
}
Run Code Online (Sandbox Code Playgroud)