代码之家  ›  专栏  ›  技术社区  ›  Padu Merloti

如何创建有意义的动态属性?

  •  3
  • Padu Merloti  · 技术社区  · 16 年前

            IODevice dio = new IODevice();
    
            try
            {
                dio.Pin["IsBirdInCageSensor"].Set();
                dio.Pin["KillBird"].Get();
                //dio.Pin["NonExistant"].Set(); //exception
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
    

    这里的管脚是数字IO盒中的一系列IO线,可以高(1)或低(0)。

    我想使用dynamic以以下方式调用它:

            dio.Pins.KillBird.Get();
    

    class IODevice
    {
        public IODevice()
        {
            pin = new PinCollection();
            pin.Add(new Pin("IsBirdInCageSensor", 0));
            pin.Add(new Pin("KillBird", 1));
        }
    
        private PinCollection pin;
        public PinCollection Pin { get { return pin; } }
    
        public dynamic Pins { get; private set; }
    }
    

    1 回复  |  直到 16 年前
        1
  •  2
  •   itowlson    16 年前

    如果你想继续使用现有的 PinCollection 类型,则需要实现PinCollection IDynamicMetaObjectProvider . 然后Pins将返回与Pin相同的PinCollection,但是因为它的类型是dynamic,所以允许 obj.Pins.KillBird

    如果可以更改实现,那么可以使用 ExpandoObject 班级:

    private ExpandoObject _pins;
    public dynamic Pins { get { return _pins; } }
    

    ExpandoObject基本上是一个字典,它已经有了一个将动态属性访问转换为字典访问的元对象。请注意,在这种情况下,您必须摆脱强类型的PinCollection,或者找出一些方法来同步这两个部分:您不希望在这两个位置存储不同的pin数据。