首页 > 解决方案 > 检查 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

我该如何实施?

标签: c#generics

解决方案


使用OfType,它将只返回那些可以安全地转换为类型的:

foreach (var item in items.OfType<IStatusResult>())
{
    item.StatusName = statuses[item.Status];
}

推荐阅读