Gui*_*doG 4 c# setter properties
我有一个属性ggFileName定义如下:
private string _ggFileName = "";
public string ggFileName
{
get
{
return _ggFileName;
}
set
{
_ggFileName = value;
ReadXmlSchemaFromFile();
}
}
Run Code Online (Sandbox Code Playgroud)
在为ggFileName赋值时,方法ReadXmlSchemaFromFile(); 叫做.到现在为止还挺好.
我的问题是,当我为属性ggFileName分配它已经包含的相同值时,没有任何反应.在为其分配不同的值之前,不会调用setter.
我同意在几乎所有情况下这都是完全符合逻辑的,但在我的情况下它会引发一个问题.如果ggFileName中的文件在我的应用程序之外更改怎么办?将同一文件再次分配给ggFileName不会调用我的setter,因此也不会调用ReadXmlSchemaFromFile().所以现在我必须将一个虚拟文件设置为属性ggFileName,然后再将相同的文件再次分配给ggFileName以使其正常工作.
C#似乎想通过在分配相同值时不调用setter来帮助我,我怎么能告诉c#停止帮助我呢?
我不知道C#这样做,在我所有的setter方法我有这样的代码:(!值= _myValue)如果{做二传手逻辑在这里}我想我不需要写检查了不是?
只是为了让事情更清楚,因为人们似乎不理解我的问题.1.我的setter确实被调用,但仅在分配不同的值时2.我不想使用方法,因为在设置属性之后我想要完成一些检查并且我不希望我的类的任何其他用户能够绕过检查.属性的用途是什么?3.分配我无法发布的值的代码.它是自定义控件的属性,设计者通过编辑对象检查器来调用它.同样,只要我继续为它提供不同的价值,它就会起作用
谢谢
Dav*_*ead 19
对于它的价值 - 我遇到了这个问题,在我们的代码库中,它归结为Fody.
Fody插入相等检查并使设定器短路.我真的不希望你的问题归结为Fody(因为你提到了视觉设计师).我认为对我这样做的人来说,这可能是有价值的.
我使用dotPeek找到要插入的代码.
为了您的利益,我使用dotPeek检查winforms PropertyGrid并找到下面的代码片段.视觉工作室可能会有所不同,但我强烈怀疑它正在做类似的事情.如果你非常热衷于在设置不同的值时可以记录调用堆栈.调用堆栈中的某个位置是具有相等性检查的函数.
private object SetPropertyValue(object obj, object objVal, bool reset, string undoText)
{
DesignerTransaction designerTransaction = (DesignerTransaction) null;
try
{
object propertyValueCore = this.GetPropertyValueCore(obj);
if (objVal != null && objVal.Equals(propertyValueCore)) // if equal return!!!!
return objVal;
this.ClearCachedValues();
Run Code Online (Sandbox Code Playgroud)
关于Fody:
这种在新指令中"编织"的技术非常强大.您可以将简单的公共属性转换为完整的INotifyPropertyChanged实现,添加对空参数的检查,将Git哈希添加到程序集中,甚至使所有字符串比较不区分大小写.
值得注意的是,可以使用[DoNotCheckEquality]禁用它.
小智 3
问题出在 Visual Studio 的越野车设计师身上。在设计时使用“属性窗口”设置属性值时,如果该窗口中已有相同的值,则该窗口不会为您的属性设置该值。
在代码中执行此操作时没有问题,无论如何都会设置该值。
这是微软如何试图帮助你的另一个很好的例子(所有这些都是向后而不是向前帮助你......)