作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有那些类(class):
public class FilterBackOfficeDiscountFilterType
{
public FilterBackOfficeDiscountFilterType();
public FilterBackOfficeDiscountFilterType(string filterValue = null, string filterType = null);
[JsonProperty(PropertyName = "filterType")]
public string FilterType { get; set; }
[JsonProperty(PropertyName = "filterValue")]
public string FilterValue { get; set; }
}
还有我的:
public abstract class Filter<T>
where T : struct
{
public T Type { get; set; }
public string Value { get; set; }
}
和:
public class DiscountFilter : Filter<DiscountFilterType>
{
}
我想以显式或隐式方式将 DiscountFilter
转换为 FilterBackOfficeDiscountFilterType
。
所以我添加运算符方法:
public class DiscountFilter : Filter<DiscountFilterType>
{
public static implicit operator FilterBackOfficeDiscountFilterType(DiscountFilter filter)
=> new FilterBackOfficeDiscountFilterType(filterType: filter.Type.ToString(), filterValue: filter.Value);
}
但它不编译因为:
Cannot implicitly convert type 'Filter<DiscountFilterType>' to 'FilterBackOfficeDiscountFilterType'
我该怎么做?
DiscountFilterType
是一个枚举。
FilterCreator.Create 是:
public class DiscountFilterCreator : FilterCreator<DiscountFilterType>
{
public override Filter<DiscountFilterType> Create(DiscountFilterType type, string value)
=> new DiscountFilter {Type = type, Value = string.IsNullOrWhiteSpace(value) ? null : value};
}
它来源于:
public abstract class FilterCreator<T>
where T : struct
{
public abstract Filter<T> Create(T type, string value);
}
最后一个 Filter
是:
public abstract class Filter<T>
where T : struct
{
public T Type { get; set; }
public string Value { get; set; }
}
编辑要重现问题,您必须这样做
DiscountFilter filter = new DiscountFilterCreator().Create(DiscountFilterType.normal, "wow");
编辑
DiscountFilter x = this.FilterCreator.Create(DiscountFilterType.BrandId, brandId);
FilterBackOfficeDiscountFilterType y = x;
编辑它有效:
DiscountFilter x = (DiscountFilter)this.FilterCreator.Create(DiscountFilterType.BrandId, brandId);
FilterBackOfficeDiscountFilterType y = x;
但我想这样做:
FilterBackOfficeDiscountFilterType x = this.FilterCreator.Create(DiscountFilterType.BrandId, brandId);
所以我也需要这个隐式转换:
public class DiscountFilter : Filter<DiscountFilterType>
{
public static implicit operator DiscountFilter(Filter<DiscountFilterType> filter)
=> new DiscountFilter {Value = filter.Value};
public static implicit operator FilterBackOfficeDiscountFilterType(DiscountFilter filter)
=> new FilterBackOfficeDiscountFilterType(filterType: filter.Type.ToString(), filterValue: filter.Value);
}
但是不允许从派生类到基类的隐式转换!
DiscountFilter.implicit operator DiscountFilter(Filter<DiscountFilterType>): user-defined conversions to or from a base class are not allowed
最佳答案
(隐式)用户定义的从基类到派生类的转换是一个坏主意,因此不受语言支持,如这里已经解释的:User-defined conversion operator from base class
作为您问题的解决方案,我建议按如下方式调整您的基本类型:
public abstract class FilterCreator<TFilter, TFilterType>
where TFilter : Filter<TFilterType>
where TFilterType : struct
{
public abstract TFilter Create(TFilterType type, string value);
}
public abstract class Filter<T>
where T : struct
{
public T Type { get; set; }
public string Value { get; set; }
}
然后您可以将 DiscountFilterCreator 实现为
public class DiscountFilterCreator : FilterCreator<DiscountFilter, DiscountFilterType>
{
public override DiscountFilter Create(DiscountFilterType type, string value)
=> new DiscountFilter { Type = type, Value = string.IsNullOrWhiteSpace(value) ? null : value };
}
使用它,您将不再需要转换,因为返回的类型是预期的类型。
不确定这正是您想要的。按照 C# 的标准,代码似乎非常抽象,很可能有更好的设计来满足您的需求。
编辑:作为旁注,此实现呈现 FilterCreator
几乎没用。 Filter<T>
的用处似乎也很值得怀疑——你有没有声明过一个类型为Filter<T>
的变量或泛型约束? ?
关于c# - 泛型类型的显式和隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43407516/
我是一名优秀的程序员,十分优秀!