我上过这堂课:
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)并且我不想手动复制每个属性(在我的实际用例中,有多个属性),如果我不需要。是用户定义的类型转换的方式吗?
答案 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)
如果您收到InvalidCastException
,Foo
返回的GetFoo()
类型不是Foo<T>
。您需要将T
或typeof(T)
传递给该函数,以便它可以返回Foo<T>
的实例。
答案 2 :(得分:0)
使用复制构造函数。 Foo实现:
class Foo {
Foo(Foo copy) { ... }
}
而Foo应使用以下内容构建:
class Bar<T> : Foo {
Bar(Foo copy) : base(copy) { ... }
}
...是的。您需要按成员复制成员,这应该在“复制构造函数”中完成。