繁体   English   中英

用C#动态转换

[英]Dynamic Cast in C#

我有一个称为Rack的抽象基类,并且有不同类型的机架,它们是Rack的子级。 我希望能够动态地将通用C#对象转换为Rack类的不同子级,以便调用所有子级都具有作为方法的正确getData方法。 这是我到目前为止所拥有的。
下面的代码在Rack基类中调用虚拟方法。 我需要它来调用Rack子类中的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace IO_Interface
{
class Channel
{
    private object rack1;
    private object rack2;
    public Channel()
    {

    }

    public Channel(object h1, object h2)
    {
        rack1 = h1;
        rack2 = h2;
    }

    public void send()
    {

        Type rack1Info = rack1.GetType();
        Type rack2Info = rack2.GetType();
        string name = rack1.ToString();

        MethodInfo castMethod = rack1.GetType().GetMethod("getData").;
        castMethod.Invoke(rack1.GetType(), null);

    }

}
}`

您想要做的是将您的rack1和rack2声明为Racks,这将是带有抽象方法GetData的抽象类。 您将在某处将它们实例化为Rack的子类。 然后,当您在机架上调用GetData时,它将找到被覆盖的方法并调用它。 这是一个例子。

abstract class Rack
{
   public abstract void GetData();
}

class ChildRack1 : Rack
{
    public override void GetData(){}
}

class ChildRack2 : Rack
{
    public override void GetData(){}
}

class Channel
{
    private Rack rack1;
    private Rack rack2;
    public Channel()
    {

    }

    public Channel(Rack h1, Rack  h2)
    {
        rack1 = h1;
        rack2 = h2;
    }

    public void send()
    {

        rack1.GetData();
    }

}

我认为这将为您提供所需的实现:

    class Channel
    {
        private List<Rack> racks;

        public Channel()
        {
            racks = new List<Rack>();
        }

        public Channel(params Rack[] racks)
        {
            this.racks = racks.ToList();
        }

        public void send()
        {
            foreach (Rack item in racks)
            {
                item.getData();
            }

        }

        public void SendSpecificRack(Rack rack)
        {
            //calls the getdata of the rack object passed
            rack.getData();
        }

    }

    public class Rack
    {
        public virtual void getData()
        {
            Console.WriteLine("Base Rack");
        }
    }

    public class RackChild1 : Rack
    {
        public override void getData()
        {
            Console.WriteLine("RackChild1");
        }
    }

    public class RackChild2 : Rack
    {
        public override void getData()
        {
            Console.WriteLine("RackChild2");
        }
    }

用法:

Channel chn = new Channel(new Rack[]{new RackChild1(),new RackChild2()});
chn.send();
RackChild2 rck = new RackChild2();
chn.SendSpecificRack(rck);

输出:

RackChild1
RackChild2
RackChild2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM