gpt4 book ai didi

c# - 取决于类型 T 的枚举

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:09 25 4
gpt4 key购买 nike

我有一个通用类需要根据定义的类型限制枚举:

public enum ConditionOperatorsString { None, Like, Equal }
public enum ConditionOperatorsDate { None, Equal, BeforeThan, AfterThan }
public class Condition<T>
{
public T Value { get; set; }
public ConditionOperatorsString Operator { get; set; }
public Condition(T Value, ConditionOperatorsString Operator)
{
this.Value = Value;
this.Operator = Operator;
}
}

现在的问题是我希望 Operator 类型依赖于 T 所以当:

Condition<string> CStr= new Condition<string>(string.Empty, ConditionOperatorsString.None)
Condition<DateTime> CStr= new Condition<DateTime>(DateTime.Now, ConditionOperatorsDate.None)

如何为此定义类条件?我想到了一个接口(interface),但枚举不会从接口(interface)继承。

最佳答案

没有好的方法可以做你想做的事情,在你的构造函数中是这样的:

if (typeof(T) == typeof(string) && 
typeof(Operator) != typeof(ConditionOperatorsString))
{
throw new Exception("Invalid conditionoperators value);
}

这真的不是很有用,因为你必须提前知道 T 的所有不同可能性。

可以做的事情是这样的:

public abstract class ComparableBase<T,K>
{
public T Value { get; protected set; }
public K ConditionOperator { get; protected set; }
// public abstract bool IsMatch(T other); // Is this required?

protected ComparableBase(T value, K op)
{
this.Value = value;
this.ConditionOperator = op;
}
}

public enum ComparableOperator { None, Equal, Less, Greater }

public enum LikeOrEqualOperator { None, Like, Equal }

public class ComparableCondition<T> : ComparableBase<T,ComparableOperator>
{
public ComparableCondition(T value, ComparableOperator op):base(value, op)
{
}
}

public class LikeOrEqualCondition<T> : ComparableBase<T, LikeOrEqualOperator>
{
public LikeOrEqualCondition(T value, LikeOrEqualOperator op):base(value, op)
{
}
}

然后你可以声明

var condition1 = new LikeOrEqualCondition<string>("hi", LikeOrEqualOperator.Equal);

你需要有一个IsMatch吗?或者这是为了显示选定的过滤器,而不是实际实现它。

如果你这样做,事情会稍微复杂一点......

关于c# - 取决于类型 T 的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1365681/

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