Cast Class to Class

问题描述 投票:1回答:3

我有一个简单的类,看起来像这样:

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
        };
    }
}

任何人都可以指出我要去哪里的地方吗?

c# generics casting
3个回答
0
投票
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);

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; } }


0
投票
完全放弃泛型。你能做到吗?

class X {} class Y : X {} ... var x = new X(); var y = (Y)x;

没有你不能。 X不是Y。同样,MyClass<string>不是MyClass

进一步说,您的转换代码仍然无法像您所说的那样工作,并且尝试以其他方式(例如,用string专门键入)定义隐式或显式转换运算符甚至都不会编译。

解决方案

请执行33t的解决方案。这是最直接的方法。

    做@ ja72的解决方案。它有效,并且是最通用的。
  • 创建自己的静态方法进行转换或创建扩展方法进行转换。
  • [从MyClass中断MyClass<string>的继承并定义您的运算符。是的,这意味着一些冗余代码。
© www.soinside.com 2019 - 2024. All rights reserved.