[英]How to change the DisplayNameAttribute on runtime to use in a Property Grid 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
并覆盖您需要将其virtual
的HmdTransform
访问器 更简单-只需添加重写属性,例如:
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.