gpt4 book ai didi

c# - 泛型类型的显式和隐式转换

转载 作者:行者123 更新时间:2023-11-30 15:18:35 32 4
gpt4 key购买 nike

我有那些类(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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com