c# - 检查 T 是否实现了接口并在填充接口属性后返回 T
问题描述
我有一个通用方法,它将 T 列表作为参数。我正在尝试根据接口类型获取某些数据,并仅填充列表中每个项目的那些属性,这些属性在接口中定义。
所以我的基本界面是:
public interface IStatusResult
{
int Status { get; set; }
string StatusName { get; set; }
}
我有许多实现此接口的其他接口,我想用它们来确定要检索的状态/状态名称键/值对:
public interface IROQStatusResult: IStatusResult { }
public interface IOrderStatusResult: IStatusResult { }
public interface IActivityStatusResult: IStatusResult { }
最后,我在我的搜索结果类中实现了这个接口:
public class RecommendedOrderQuantitySearchResult:IROQStatusResult {
public int Id { get; set; }
public DateTime TargetDate { get; set; }
public int Status { get; set; }
public string StatusName { get; set; }
}
因此,一旦从数据库中获取列表,我想在通用方法中设置状态名称:
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;
}
目前,item.StatusName
给我一个错误:项目没有财产StatusName
我该如何实施?
解决方案
使用OfType
,它将只返回那些可以安全地转换为类型的:
foreach (var item in items.OfType<IStatusResult>())
{
item.StatusName = statuses[item.Status];
}
推荐阅读
- angular - 自动设置占位符的指令
- tfs - TFS 2018 Wiki HTML 视频不显示嵌入视频
- c# - c# Linq - 检查复合键是否存在于另一个列表中
- docker - 如何在 Raspberry Pi 3 上的 Docker 中运行 haproxy?
- angular - 禁用特定值的角度材料行上的单击事件
- python - 使用 Flask 应用程序在本地计算机上出现 404 错误
- r - 在R中使用过滤器后如何在表格中显示具有非零频率的组合
- python - 在 Keras 中使用 LSTM 进行多对一预测,重塑数据
- sql - SQL Server 中是否有与 pythons 的 SequenceMatcher 等效的方法来连接相似的列?
- r - R 不显示结果