VB.Net WriteOnly Property to C#

本文关键字:to Property WriteOnly Net VB | 更新日期: 2023-09-27 18:01:36

我将这个类作为VB.Net中自定义控件的一部分编写。它允许我切换3个链接标签的状态,并使用text属性设置每个标签的文本。这就是允许用户使用它做的所有事情。我可以毫无问题地转换Enabled属性和构造函数,但是我不确定转换Text属性的最佳方法是什么。函数将接受2个参数,索引器将对LabelExtender3起作用,而不是像目前在VB.Net中那样对Text起作用。那么转换这种形式的正确方法是什么呢?

Public Class LabelExtender3
    Private lblTemp(2) As Label
    Public WriteOnly Property Enabled As Boolean
        Set(value As Boolean)
            If value Then
                lblTemp(0).ForeColor = Color.MediumBlue
                lblTemp(1).ForeColor = Color.MediumBlue
                lblTemp(2).ForeColor = Color.MediumBlue
            Else
                lblTemp(0).ForeColor = Color.SteelBlue
                lblTemp(1).ForeColor = Color.SteelBlue
                lblTemp(2).ForeColor = Color.SteelBlue
            End If
        End Set
    End Property
    Public WriteOnly Property Text(ByVal index As Integer) As String
        Set(value As String)
            lblTemp(index).Text = value
        End Set
    End Property
    Friend Sub New(ByRef value1 As Label, ByRef value2 As Label, ByRef value3 As Label)
        lblTemp(0) = value1
        lblTemp(1) = value2
        lblTemp(2) = value3
    End Sub
End Class

VB.Net WriteOnly Property to C#

你遇到了VB。. NET有c#没有的可索引属性。

更具体地说,c#缺乏声明它们的能力,但它能够消费它们(在c# 4.0中添加),这可能仅限于COM互操作使用。

在这种情况下,你最好创建一个方法:

public void SetText(int index, string value)
{
    lblTemp[index].Text = value;
}

c#不允许带参数的属性,所以没有直接的转换,但是你可以直接创建一个方法。

我发现它是最好的转换工具(我与这家公司没有任何关系):
//INSTANT C# NOTE: C# does not support parameterized properties - the following property has been rewritten as a 'set' method:
//ORIGINAL LINE: Public WriteOnly Property Text(ByVal index As Integer) As String
    public void set_Text(int index, string value)
    {
        lblTemp[index].Text = value;
    }

在c#中,WriteOnly属性等于一个只有set部分的c#属性。但是你不能将参数传递给c#属性,除非它是一个索引器,所以它变成了一个方法。因此,您可以将代码转换为:

public class LabelExtender3
{
    private Label[] lblTemp = new Label[3];
    public bool Enabled
    {
        set
        {
            if (value)
            {
                lblTemp[0].ForeColor = Color.MediumBlue;
                lblTemp[1].ForeColor = Color.MediumBlue;
                lblTemp[2].ForeColor = Color.MediumBlue;
            }
            else
            {
                lblTemp[0].ForeColor = Color.SteelBlue;
                lblTemp[1].ForeColor = Color.SteelBlue;
                lblTemp[2].ForeColor = Color.SteelBlue;
            }
        }
    }
    public string SetText(int index, string value)
    {
        lblTemp[index].Text = value;
    }
    internal LabelExtender3(ref Label value1, ref Label value2, ref Label value3)
    {
        lblTemp[0] = value1;
        lblTemp[1] = value2;
        lblTemp[2] = value3;
    }
}