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

时间:2010-03-29 04:47:57

标签: c# generics

我上过这堂课:

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

这个班级

class Foo<T> : Foo {
    public T Data { get; set; }
}

这就是我想要做的事情:

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

    Foo<T> foot = (Foo<T>)foo;
    foot.Data = GetData<T>();
    return foot;
}

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

3 个答案:

答案 0 :(得分:2)

您可以在Foo<T>内从Foo创建显式转换。

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

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

  

我们取得了自由   预定义转换(强制转换)   在基类和派生之间   类,并使语义   语言可预测我们没有   允许你弄乱它

看起来您可能会遇到定义将Foo变为Foo<T>的方法。那,或者放弃继承。这两种解决方案听起来都不是特别理想。

答案 1 :(得分:1)

如果您收到InvalidCastExceptionFoo返回的GetFoo()类型不是Foo<T>。您需要将Ttypeof(T)传递给该函数,以便它可以返回Foo<T>的实例。

答案 2 :(得分:0)

使用复制构造函数。 Foo实现:

class Foo {
     Foo(Foo copy) { ... }
}

而Foo应使用以下内容构建:

class Bar<T> : Foo {
      Bar(Foo copy) : base(copy) { ... }
}

...是的。您需要按成员复制成员,这应该在“复制构造函数”中完成。