Cap*_*ohn 24 .net c# inheritance objectinstantiation
我正在从父对象创建一个子对象.所以场景是我有一个对象和一个子对象,它为我想要搜索的场景添加了一个距离属性.我选择使用继承,因为我的UI与搜索对象或对象列表等效地工作,而不是位置搜索的结果.所以在这种情况下,继承似乎是一个明智的选择.
目前我需要MyObjectSearch从一个实例生成一个新对象MyObject.目前我通过逐个设置属性手动在构造函数中执行此操作.我可以使用反射,但这会很慢.有没有更好的方法来实现这种对象增强?
希望下面的代码说明了这个场景.
public class MyObject {
    // Some properties and a location.
}
public class MyObjectSearch : MyObject {
    public double Distance { get; set; }
    public MyObjectSearch(MyObject obj) {
         base.Prop1 = obj.Prop1;
         base.Prop2 = obj.Prop2;
    }
}
我的搜索功能:
public List<MyObjectSearch> DoSearch(Location loc) { 
  var myObjectSearchList = new List<MyObjectSearch>();       
   foreach (var object in myObjectList) {
       var distance = getDistance();
       var myObjectSearch = new MyObjectSearch(object);
       myObjectSearch.Distance = distance;
       myObjectSearchList.add(myObjectSearch);
   } 
   return myObjectSearchList;
}
ja7*_*a72 31
基类需要定义一个复制构造函数:
public class MyObject
{
    protected MyObject(MyObject other)
    {
        this.Prop1=other.Prop1;
        this.Prop2=other.Prop2;
    }
    public object Prop1 { get; set; }
    public object Prop2 { get; set; }
}
public class MyObjectSearch : MyObject
{
    public double Distance { get; set; }
    public MyObjectSearch(MyObject obj)
         : base(obj)
    {
        this.Distance=0;
    }
    public MyObjectSearch(MyObjectSearch other)
         : base(other)
    {
        this.Distance=other.Distance;
    }
}
这样,基类就可以为所有派生类处理属性设置.
meh*_*hdi 13
您可以使用反射来复制属性。
public class ChildClass : ParentClass
{
    public ChildClass(ParentClass ch)
    {
        foreach (var prop in ch.GetType().GetProperties())
        {
            this.GetType().GetProperty(prop.Name).SetValue(this, prop.GetValue(ch, null), null);
        }
    }
}
不幸的是,没有简单的方法可以做到这一点。如您所说,您要么必须使用反射,要么创建一个“克隆”方法,该方法将使用父对象作为输入来生成一个新的子对象,如下所示:
public class MyObjectSearch : MyObject {
    // Other code
    public static MyObjectSearch CloneFromMyObject(MyObject obj)
    {
        var newObj = new MyObjectSearch();
        // Copy properties here
        obj.Prop1 = newObj.Prop1;
        return newObj;
    }
}
无论如何,您要么最终要编写反射代码(这很慢),要么手动写出每个属性。这完全取决于您是否需要维护性(反射性)或速度(手动属性副本)。
一个通用的解决方案是将其序列化为 json 并返回。json 字符串中没有有关序列化的类名的信息。大多数人用 javascript 来做这件事。
正如您所看到的,它适用于 pocco 对象,但我不保证它适用于所有复杂的情况。但当属性匹配时,它会为非继承类触发事件。
using Newtonsoft.Json;
namespace CastParentToChild
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var p = new parent();
            p.a=111;
            var s = JsonConvert.SerializeObject(p);
            var c1 = JsonConvert.DeserializeObject<child1>(s);
            var c2 = JsonConvert.DeserializeObject<child2>(s);
            var foreigner = JsonConvert.DeserializeObject<NoFamily>(s);
            bool allWorks = p.a == c1.a && p.a == c2.a && p.a == foreigner.a;
            //Your code goes here
            Console.WriteLine("Is convertable: "+allWorks + c2.b);
        }
    }
    public class parent{
        public int a;
    }
    public class child1 : parent{
     public int b=12345;   
    }
    public class child2 : child1{
    }
    public class NoFamily{
        public int a;
        public int b = 99999;
    }
    // Is not Deserializeable because
    // Error 'NoFamily2' does not contain a definition for 'a' and no extension method 'a' accepting a first argument of type 'NoFamily2' could be found (are you missing a using directive or an assembly reference?)
    public class NoFamily2{
        public int b;
    }
}