繁体   English   中英

如何在C#中的运行时更改属性获取器

[英]How to change a property getter at runtime in C#

我有一个带有如下所示属性的类:

public class Hmd{
    Transform HmdTransform{
        get{ device.GetTransform(); }
    }
}

device.GetTransform()从驱动程序获取Transform。

现在,我想在运行时将属性的get方法更改为:

public class Hmd{
    private Transform hmdTransform;
    Transform HmdTransform{
        get{ return hmdTransform; }
    }
}

有什么办法吗? 我将不得不创建一个新成员并更改吸气剂。 如果无法创建新成员,是否可以更改device.GetTransform()行? 我认为我必须使用Reflection.Emit?

额外的复杂性:所有这些都在Unity中,所以我只能使用Mono。

您不能这样重写属性-您不能在.NET中进行猴子补丁。

选项:

  • 遗产; 使用TypeBuilder创建一个类型,该类型Hmd并覆盖您需要将其virtualHmdTransform访问器
  • 更简单-只需添加重写属性,例如:

     public class Hmd{ Transform HmdTransformOverride {get;set;} Transform HmdTransform{ get{ return HmdTransformOverride ?? device.GetTransform(); } } } 

或更简单:

public class Hmd{
    Transform _transform;
    Transform HmdTransform{
        get { return _transform ?? device.GetTransform(); }
        set { _transform = value; }
    }
}

这允许单个属性同时满足这两个目的。 当未设置(或显式设置为null )时,将应用默认行为,但可以为其指定显式值。

使用Func<Transrom>替换属性。

public class Hmd
{
    Transform _transform;
    Func<Transform> HmdTransform;

    public Hmd()
    {
        HmdTransform = HmdTransfromA;
    }

    public void SwapHmdTranformGetWay()
    {
        if (HmdTransform == HmdTransfromA)
        {
            HmdTransform = HmdTransfromB;
        }
    }

    private Transform HmdTransfromA()
    {
        //TODO A Solution
        return null;
    }
    private Transform HmdTransfromB()
    {
        //TODO B Solution
        return null;
    }
}

用例:

 var hmd =new Hmd()
 var A = hmd.HmdTransform(); // Get Tranform By A Solution
 hmd.SwapHmdTranformGetWay(); // Change Get Tranform Way
 var B = hmd.HmdTransform(); // Get Tranform By B Solution

暂无
暂无

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

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