检查T是否实现了接口并在填充接口属性后返回T.

Jus*_*ing 2 c# generics

我有一个通用方法,它将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

我该如何实现呢?

nvo*_*igt 5

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

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