如何将Object数组转换为Custom Class数组?

时间:2013-04-09 12:35:16

标签: c#

我有

public class ABSInfo 
    {
        public decimal CodeCoveragePercentage { get; set; }
        public TestInfo TestInformation { get; set; }      

    }

我有一个Object数组说“SourceType”

public object[] SourceType { get; set; }

我想将Object Array(SoiurceType)转换为ABSInfo []。

我正在尝试

ABSInfo[] absInfo = Array.ConvertAll(SourceType, x => (ABSInfo)x);

但错误

无法将“WindowsFormsApplication1.TestInfo”类型的对象强制转换为“WindowsFormsApplication1.ABSInfo”。

如何进行转换?

编辑:

public class TestInfo
    {
        public int RunID { get; set; }
        public TestRunStatus Status { get; set; }
        public string Description { get; set; }
        public int TotalTestCases { get; set; }
        public int TotalTestCasesPassed { get; set; }
        public int TotalTestCasesFailed { get; set; }
        public int TotalTestCasesInconclusive { get; set; }
        public string ReportTo { get; set; }
        public string Modules { get; set; }
        public string CodeStream { get; set; }
        public int RetryCount { get; set; }
        public bool IsCodeCoverageRequired { get; set; }
        public FrameWorkVersion FrameworkVersion { get; set; }
        public string TimeTaken { get; set; }
        public int ProcessID { get; set; }
        public int GroupID { get; set; }
        public string GroupName { get; set; }
    }

4 个答案:

答案 0 :(得分:6)

您可以使用LINQ;

ABSInfo[] absInfo = SourceType.Cast<ABSInfo>().ToArray();

或者

ABSInfo[] absInfo = SourceType.OfType<ABSInfo>().ToArray();

第一个将尝试将每个源数组元素转换为ABSInfo,并且当至少一个元素不可能时,将返回InvalidCastException

第二个将仅返回数组中的这些元素,这些元素可以转换为ABSInfo个对象。

答案 1 :(得分:0)

你有一个对象数组。除非所有对象都是object(或更多派生类)的实例,否则无法将所有ABSInfo强制转换为ABSInfo

所以要么在数组中加上

ABSInfo[] absInfo = Array.ConvertAll(SourceType, x => x as ABSInfo);

或者不要向ABSInfo添加除SourceType之外的其他内容。

答案 2 :(得分:0)

通过从ABSInfo继承{<1}}

来更正您的TestInfo课程
public class ABSInfo : TestInfo
{
    public decimal CodeCoveragePercentage { get; set; }
}

这将解决转换问题,并允许您直接在ABSInfo类实例上访问TestInfo属性。

答案 3 :(得分:0)

您的数组似乎包含TestInfo类型的对象 因此,您需要为数组中的每个TestInfo构建一个对象ABSInfo。

在LINQ中:

var absInfo = SourceType.Select(s => new ABSInfo()
                            { 
                              TestInformation = (TestInfo)s
                            , CodeCoveragePercentage = whatever
                            }).ToArray()