将对象分配给对象类型的属性

时间:2020-02-06 19:53:46

标签: c# properties copy clone

经过很多环顾(包括类似但不相同的问题),我希望我的问题会有意义,并且有人可以帮助我解决这个问题。

我有很多类,例如ClassA,ClassB,ClassC等,它们都出于特定原因而存在。 我还有另一个用于测试目的的类,它包括两个属性,设置如下:

  public class Test : Countable<TestScenario>
  {


    //test completed
    public bool completed { get; set; } = false;

    //break or error (stop further execution) or not
    public bool breakOnError { get; set; } = true;

    //test result
    public bool success { get; set; } = false;

    //what did we test
    public string testCase { get; set; } = string.Empty;

    //what data we got as result
    public object testDataResult { get; set; }

    public Test()
    {
    }

   }

我的问题是:我实例化该类,即Test myTest = new Test();等等,我需要分配一个类,例如myResult(包含数十个带有值的属性)。

我需要这样做(类似):

    Test myTest = new Test();
     myTest.testDataResult = myResult;

可以放心地假设以后,例如,如果有一个myResult.SomeProperty的值为18,我想从myTest.testDataResult.SomeProperty中查看它 即

Console.WriteLine(myTest.testDataResult.SomeProperty.ToString());
//18

这可能吗?在四处查看Binaryformatters和Reflection时,一个示例似乎也不错(https://www.codeproject.com/Articles/1111658/Fast-Deep-Copy-by-Expression-Trees-C-Sharp),在SO(Faster deep cloning)的链接中提到,但我做不到,超出了我的经验水平。

有人可以帮我举一个可行的例子吗?

3 个答案:

答案 0 :(得分:0)

如果我理解正确,在我看来您正在混淆。

当您为对象分配内容时,就是说您将实例放入没有突出类型的盒子中。这意味着当您要读取该实例时,首先必须将其转换为正确的类型才能访问属性。

您必须执行以下操作:

(SomeClss()myTest.testDataResult).Property1

由于这个原因,您应该尝试引入一个类型(可以是接口)来描述所需的最少方法和属性集。如果不能,没问题,您只需要进行转换即可。请记住,如果选择了错误的类型,则后一种方法可能会在运行时崩溃,而前一种方法则允许您在编译时发现错误。

答案 1 :(得分:0)

我认为最简单的方法是使您的Test类通用:

public class Test<TResult> : Countable<TestScenario>
{
  // ... the test outcome properties listed above
  public TResult testDataResult { get; set; }
  // ... constructor
}

这将使您无需任何黑魔法就可以访问测试数据结果实例的所有属性。

答案 2 :(得分:0)

与大多数其他对象一样,

object是一个类。您可以从中继承,实例化它的对象(但很少这样做),声明其类型的变量。但是,由于其历史/设计位置独特,因此有2条特殊规则:

  1. 每个单个类都隐式或显式继承自object。如果您没有定义基类,则对象被隐式地应用。如果定义了基类,则只需追溯到继承链足够远的地方,即可找到对象。类型对象是每个类层次结构的根。

  2. 虽然数字类型,结构和co不继承自Object,但是可以将它们装箱成对象。看起来非常相似,但是细节有所不同。

因此,.NET中的每个可想象的类型都可以分配给类型为object的变量。无论如何,它要么是一个对象,所以继承就可以接管,也可以将其装箱成一个对象。现在,我们不再使用object作为类型了。尽管可以为对象分配任何内容,但您在这样做时会松开编译时类型检查。这是非常重要的事情。如果可以的话,我永远也不会牺牲。

泛型与对象

使用对象作为类型已不再受到泛型的青睐。 lock statement是极少数情况下的一种,您仍然可以创建类型为object的变量并显式创建object的istance。您将在事件处理程序中找到用于sender的类型对象(这是对流的50%,有用的50%)。在我们使用泛型的其他地方几乎都有。

泛型已被添加到框架和语言中,专门用于避免不得不诉诸作为变量类型。我非常有意地选择了“度假胜地”。像List<T>Queue<T>Dictionary<TKey,TValue>这样的泛型集合替换了诸如Queue,HashTable之类的前泛型集合,以及我们用来代替列表的所有泛型集合。

我们无法真正弄清您的目标是什么。但是,听起来确实很像XY问题,这仅仅是因为将对象用作变量类型是其中的一部分。

相关问题