我有一个简单的类,看起来像这样:
public class MyClass<T>
{
public int Status { get; set; }
public T Value { get; set; }
}
[为了方便起见,我有另一个从MyClass<string>
继承的类,使我可以在没有通用参数的情况下构造MyClass
,例如:
public class MyClass : MyClass<string> { }
我希望能够将MyClass<T>
强制转换为MyClass
,并且似乎默认情况下不起作用。此示例强制转换引发以下错误:
MyClass<string> withT = new MyClass<string> { Status = 1, Value = "Somevalue" };
MyClass withoutT = (MyClass)withT;
无法将类型为'MyClass`1 [System.String]'的对象转换为'MyClass']
因此,我相信我需要实现一些隐式/显式强制转换逻辑,如this answer.中所述
我已经如下更新MyClass<T>
,但是仍然抛出相同的错误:
public class MyClass<T>
{
public int Status { get; set; }
public T Value;
public static implicit operator MyClass(MyClass<T> myClass)
{
return new MyClass
{
Status = myClass.Status,
Value = myClass.Value.GetType() == typeof(string) ? myClass.Value.ToString() : null
};
}
}
任何人都可以指出我要去哪里的地方吗?
public static class MyClass
{
public static MyClass<string> Create(string s, int status)
{
return new MyClass<string>(s, status);
}
}
...
var x = MyClass.Create("Foo", 0);
TDerived
继承过来的MyClass<T>
:public abstract class MyClass<TDerived, TValue> where TDerived : MyClass<TDerived, TValue>
{
protected MyClass(int status, TValue value)
{
this.Status = status;
this.Value = value;
}
public int Status { get; set; }
public TValue Value { get; set; }
public static implicit operator TDerived(MyClass<TDerived, TValue> myClass)
=> myClass as TDerived;
}
public class SpecificClass : MyClass<SpecificClass, string>
{
public SpecificClass(int status, string value) : base(status, value)
{
// The ONLY way to instantiate a MyClass<> is from a derived class
// such as this.
}
}
class Program
{
static void Main(string[] args)
{
MyClass<SpecificClass, string> my_class = new SpecificClass(-1, "ABC");
SpecificClass my_specific = my_class;
}
}
class X {}
class Y : X {}
...
var x = new X();
var y = (Y)x;
没有你不能。 X
不是Y
。同样,MyClass<string>
不是MyClass
。
进一步说,您的转换代码仍然无法像您所说的那样工作,并且尝试以其他方式(例如,用string
专门键入)定义隐式或显式转换运算符甚至都不会编译。解决方案
请执行33t的解决方案。这是最直接的方法。
MyClass
中断MyClass<string>
的继承并定义您的运算符。是的,这意味着一些冗余代码。