C#和Base-to-Derived类铸造

Mas*_*Net 0 c# casting type-conversion

我想将基类实例列表中的信息投影到派生类实例列表中,但我一直在运行异常.这是我正在尝试做的一个例子......我如何使它工作?

以下代码在http://ideone.com/CaXQS上,如果有帮助的话...提前感谢!

using System;
using System.Collections.Generic;

namespace AddingReversedNumbers
{
        public class MyDerivedClass : MyBaseClass, IMyInterface
        {
                public int InterfaceProperty { get; set; }
                public int DerivedClassProperty { get; set; }
                public List<int> DerivedClassList { get; set; }
        }

        public class MyBaseClass
        {
                public int BaseClassProperty { get; set; }
        }

        public interface IMyInterface
        {
                int InterfaceProperty { get; set; }
        }

        class Program
        {
                static void Main()
                {
                        //// This code works just fine.
                        //var derivedList = new List<MyDerivedClass>();
                        //derivedList.Add(new MyDerivedClass { BaseClassProperty = 10, DerivedClassProperty = 20, InterfaceProperty = 30 });
                        //derivedList.Add(new MyDerivedClass { BaseClassProperty = 20, DerivedClassProperty = 40, InterfaceProperty = 60 });
                        //var baseList = derivedList.ConvertAll(x => (MyBaseClass)x);

                        // This code breaks when ConvertAll() is called.
                        var baseList = new List<MyBaseClass>();
                        baseList.Add(new MyBaseClass{ BaseClassProperty = 10 });
                        baseList.Add(new MyBaseClass{ BaseClassProperty = 20 });
                        var derivedList = baseList.ConvertAll(x => (MyDerivedClass)x);
                }
        }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

在你的ConvertAll代码中,你只是施法.您不能将基类实例强制转换为派生类实例.例如,你会指望铸造objectFileStream办?它会引用哪个文件?

如果要在投影中创建对象ConvertAll,只需执行以下操作:

var derivedList = baseList.ConvertAll
      (x => new MyDerivedClass { BaseClassProperty = x.BaseClassProperty });
Run Code Online (Sandbox Code Playgroud)

  • 我不认为你可以避免映射,但如果它有意义,你总是可以在MyDerivedClass上添加一个构造函数,它接受一个MyBaseClass来封装两者之间的映射. (5认同)