KnownType属性不能使用类型参数

时间:2014-05-07 14:02:06

标签: c# asp.net asp.net-web-api

我有这个Web Api控制器动作:

public Plant<TissueProductionLine> GetPlant(string plant, string range)
{
    return _repo.GetPlant(plant, range);
}

解决这个问题我得到了这个:

  

键入&#39; IGMProdLineDashboard.Models.TissueProductionLineGroup&#39;与数据合同名称&#39; IGMProdLineDashboard.Models&#39;不是预期的。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

好的,没问题,我只是使用Plant属性装饰我的[KnownType]对象并指定非原始属性:

[KnownType(typeof(ProductionLineGroups<T>))]
public class Plant<T>: IPlant<T> where T : IProductionLine
{
    public Plant ()
    {
        ProductionLineGroups = new ProductionLineGroups<T>();
    }
    public ProductionLineGroups<T> ProductionLineGroups { get; set; }

现在我收到编译时错误:

  

&#39; IGMProdLineDashboard.Models.ProductionLineGroups&#39;:属性参数不能使用类型参数

重新阅读第一条消息,它想知道派生类型:TissueProductionLineGroup

如果我用这个装饰我的Plant对象,一切正常:

[KnownType(typeof(TissueProductionLineGroup))]

显然,这里的含义是我的Plant现在需要知道所有不同类型的生产线,这意味着每当添加新组时我都需要更新Plant。< / p>

有什么方法吗?

1 个答案:

答案 0 :(得分:2)

不幸的是,错误信息根本不会误导您。属性不能使用泛型类型参数。据我所知,没有办法解决这个问题。

Jon Skeet确实发布了关于此事的答案,并表示C#团队选择添加此限制以保持编译器代码更简单,尽管没有理由说CLI无法表示通用属性。

请参阅:https://stackoverflow.com/a/294259/2394286