C# 从Vb.net到C的类转换中的属性声明#

C# 从Vb.net到C的类转换中的属性声明#,c#,class,properties,declaration,C#,Class,Properties,Declaration,我必须在vb.net中学习,并且在转换到c#时遇到了困难。fieldlist是一个具有多个属性的类,但是只有2个属性与以下过程相关。调用该过程的代码看起来像myClass.Fields(“Test”)=123456。转换器都会从属性中删除字段名。如果我重新添加它,那么我得到的名称“value”在当前上下文中不存在 VB.net-在VB中工作良好 Public WriteOnly Property Fields(ByVal fieldName As String) As Object S

我必须在vb.net中学习,并且在转换到c#时遇到了困难。fieldlist是一个具有多个属性的类,但是只有2个属性与以下过程相关。调用该过程的代码看起来像myClass.Fields(“Test”)=123456。转换器都会从属性中删除字段名。如果我重新添加它,那么我得到的名称“value”在当前上下文中不存在

VB.net-在VB中工作良好

 Public WriteOnly Property Fields(ByVal fieldName As String) As Object
    Set(ByVal value As Object)
        If mvarFieldData Is Nothing Then mvarFieldData = New FieldList
        If mvarFieldData(fieldName) Is Nothing Then
            mvarFieldData.Add(fieldName, value)
        Else
            mvarFieldData(fieldName).FieldValue = value
        End If
    End Set
End Property
c#-我做错了什么

public object Fields(string fieldName)
{
   set {
       if (mvarFieldData == null) 
        {mvarFieldData = new FieldList();}
        if (mvarFieldData[fieldName] == null) 
        {
            mvarFieldData.Add(fieldName, value);
        } else {
            mvarFieldData[fieldName].FieldValue = value;
        }
    }
}
c#转换器(telerik)提供以下功能

public object Fields {
set {
    if (mvarFieldData == null)
        mvarFieldData = new FieldList();
    if (mvarFieldData(fieldName) == null) {
        mvarFieldData.Add(fieldName, value);
    } else {
        mvarFieldData(fieldName).FieldValue = value;
    }
}

}

mVarFieldData的范围是什么,它的确切类型是什么?它似乎是某种集合。 上面的c代码不可编译,因为您试图将方法语法与属性语法混合使用。 财产:

public object Fields{ get; set{mvarFieldData = value;} }
方法:

public object Fields(string fieldname, object val){ mvarFieldData[fieldname] = val;}
从VB.Net属性中正在进行的决策来看,我认为公共方法可能更适合这种情况。我通常只在设置封装类型成员时需要非常少量的验证时使用属性


希望这能有所帮助。

您实际上遇到了一些问题

问题1:属性不接受参数。

C#属性不能以传递fieldname的方式传递参数/参数。有几种不同的方法可以解决此问题:

  • 您可以创建索引属性(与
    myObject[fieldName]=blah
    一起使用,而不是
    myObject.Fields[fieldName]=blah
    )。使用语法
    public object this[string fieldName]
    来声明属性
  • 由于您的属性没有getter,您只需将其转换为一个带有签名的方法
    public void SetField(string fieldName,object value)
    ,调用方式如下:
    myObject.SetField(fieldName,value)
  • 您可以通过getter属性公开
    mvarFieldData
    公共字典字段{get{return mvarFieldData;}}
    ,这将允许用户直接访问字典(我假设它是这样的,基于使用情况)
  • 问题2:密钥可能不存在。

    我不确定VB.NET中的字典(或任何类似结构
    mvarFieldData
    是什么),但在C#中,值为null的键和结构中不存在的键之间存在差异

    var dict = new Dictionary<int, string>();
    dict.Add(1, null);
    if (dict[1] == null)
        Console.WriteLine("This line will be displayed.");
    if (dict[2] == null)
        Console.WriteLine("The line above this one will throw an exception.");
    
    var dict=newdictionary();
    dict.Add(1,空);
    if(dict[1]==null)
    Console.WriteLine(“将显示此行”);
    if(dict[2]==null)
    WriteLine(“这一行上面的行将抛出一个异常。”);
    

    除了当前的代码外,在开始检查与
    fieldName

    关联的值之前,还需要检查
    mvarFieldData.ContainsKey(fieldName)
    ,为什么要重新添加fieldName?与VB.NET不同,C不支持命名索引器。它只支持默认索引器。