gpt4 book ai didi

c# - 用户控件结构属性的代码生成

转载 作者:行者123 更新时间:2023-11-30 22:55:55 26 4
gpt4 key购买 nike

我创建了一个如下所示的用户控件:

public partial class TestControl : UserControl
{
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public State MyState
{
get { return new State(this); }
}

internal int[] _internalStates;

[TypeConverter(typeof(ExpandableObjectConverter))]
public struct State
{
private TestControl _myControl;
public State(TestControl _) { _myControl = _; }
public int Data
{
get { return _myControl._internalStates[0]; }
set { _myControl._internalStates[0] = value; }
}
}
}

然后我可以从工具箱中拖动控件并修改设计器中的Data值。

property

问题是设计者将在 InitializeComponent 方法中生成这段代码:

this.testControl1.MyState.Data = 0;

但是这一行会抛出一个错误:

Cannot modify the return value of 'TestControl.MyState' because it is not a variable

我明白为什么语句是错误的,问题是我如何控制代码生成来纠正错误,例如生成这样的代码?

var myState = this.testControl1.MyState;
myState.Data = 0;

更多信息

  • State struct只是修改TestControl

  • 内部属性的桥梁
  • 所以我想将 State 保留为结构以避免 GC 开销。

  • TestControl类中没有定义属性的原因是类中有多个状态,一个状态会包含多个属性,所以我需要包装修改方法而不是定义TestControl 类中的许多属性。

最佳答案

为什么 Control.StructProperty.Member = Value; 会出现编译时错误?

考虑下面的语句

this.Control.StructProperty.Value = 0;

StructProperty 是一个属性,所以首先它的 getter 将执行,因为它是一个结构并且是一个值类型,它将返回结构的副本并且为该副本设置属性是没有用的/在职的。它非常了解情况,而不是编译令人困惑的非工作代码,而是生成 Compiler Error CS1612 :

Cannot modify the return value of 'expression' because it is not avariable

如何为 Struct 属性生成工作代码?

您可能已经注意到您不能以同样的原因分配 this.Size.Width = 100。表单为 Size 属性生成代码的方式是:

this.Size = new Size(100,100);

您还可以通过从 TypeConverter 派生并返回 InstanceDescriptor 来实现类型描述符,以相同的方式为属性生成代码。在其 ConvertTo 方法中使用参数构造函数为您的结构属性生成代码,您应该为该结构提供该构造函数。

一般来说,我建议为此类属性使用类而不是结构。

关于c# - 用户控件结构属性的代码生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54889613/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com