将非泛型类型转换为泛型类型

Joh*_*han 5 c# generics

我有这门课:

class Foo { 
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

还有这堂课

class Foo<T> : Foo {
    public T Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这就是我想做的:

public Foo<T> GetSome() {
    Foo foo = GetFoo();

    Foo<T> foot = (Foo<T>)foo;
    foot.Data = GetData<T>();
    return foot;
}
Run Code Online (Sandbox Code Playgroud)

将 Foo 转换为 Foo<T> 最简单的方法是什么?我无法直接转换 InvalidCastException),并且如果不需要的话,我不想手动复制每个属性(在我的实际用例中,有多个属性)。用户定义的类型转换是正确的方法吗?

Ant*_*ram 4

您可以在 中创建从 Foo 的显式转换Foo<T>

class Program
{
    static void Main()
    {
        Foo foo = new Foo();
        foo.Name = "Blah";
        Foo<int> newfoo = (Foo<int>)foo;
        Console.WriteLine(newfoo.Name);
        Console.Read();
    }
}

class Foo
{
    public string Name { get; set; }
    public object Data { get; set; }
}

class Foo<T>
{
    public string Name { get; set; }
    public T Data { get; set; }
    public static explicit operator Foo<T>(Foo foo)
    {
        Foo<T> newfoo = new Foo<T>();
        newfoo.Name = foo.Name;
        return newfoo;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:这只适用于没有继承的情况。您似乎无法执行从基类到派生类的用户定义转换。请参阅Mads Torgersen的评论:http ://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/14cf27cf-b185-43d6-90db-734d2ca3c8d4/

我们已经自由地预定义了基类和派生类之间的转换(强制转换),并且为了使语言的语义可预测,我们不允许您弄乱它

看起来您可能会被定义一个将 Foo 转换为Foo<T>. 那,或者放弃继承权。这两种解决方案听起来都不是特别理想。