我有两种不同类型的字符串在我的代码中传递和使用,两者密切相关,但不应相互混淆。我认为我可以通过拥有两个只是字符串但名称不同的类来帮助自己避免错误,以便方法签名(以及一般的类型不兼容)将强制执行两种不同类型字符串的语义含义。同时,我不想在一百个地方重构 from something = "foo";
to 。something.Value = "foo";
第一个想法:
private class FirstKind : string { }
private class SecondKind : string { }
这个想法是,如果我有
void MyMethod(FirstKind varOne, SecondKind varTwo) {...}
,然后尝试用 调用它MyMethod(secondKindVar, firstKindVar);
,我会得到一个编译器错误。
我撞到的墙: string
被密封了。
第二个想法:创建泛型KindOf<T>
类,它只会使用隐式转换运算符接收和吐出值。像这样:
private class KindOf<T>
{
public T Value { get; set; }
public KindOf() { Value = default(T); }
public KindOf(T val) { Value = val; }
public static implicit operator T(KindOf<T> kindOf) { return kindOf.Value; }
public static implicit operator KindOf<T>(T value) { return new KindOf<T>(value); }
}
这样我可以做这样的事情:
private class FirstKind : KindOf<string> { }
private class SecondKind : KindOf<string> { }
我击中的墙:KindOf<T>
该类似乎没有继承:派生类型中既不存在构造函数,也不存在运算符,这意味着我必须在派生类中重新实现整个基类。代码复制。呸。
所以我觉得我在这里错过了一些基本的东西,也许我已经离开了杂草。对我正在尝试做的事情有任何想法吗?