我有这门课:
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),并且如果不需要的话,我不想手动复制每个属性(在我的实际用例中,有多个属性)。用户定义的类型转换是正确的方法吗?
您可以在 中创建从 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>. 那,或者放弃继承权。这两种解决方案听起来都不是特别理想。