我必须在vb.net中关注,并且在转换为C#时遇到了麻烦。 字段列表是一个具有多个属性的类,但是以下过程仅涉及2个属性。 调用该过程的代码看起来像myClass.Fields(“ Test”)=123456。所有转换器都从该属性中删除字段名。 如果将其重新添加,则会得到名称“值”在当前上下文中不存在。

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#Converters(telerik)提供以下内容

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

}

#1楼 票数:1

mVarFieldData的范围是什么,它的确切类型是什么? 看来这是某种形式的收藏。 上面的c#代码不可编译,因为您正在尝试将方法语法与属性语法混合使用。 属性:

public object Fields{ get; set{mvarFieldData = value;} }

方法:

public object Fields(string fieldname, object val){ mvarFieldData[fieldname] = val;}

通过VB.Net属性中正在进行的决策,我认为一种公共方法可能更适合这种情况。 通常,在设置封装的类型成员时,仅需要非常少量的验证即可使用属性。

希望这可以帮助。

#2楼 票数:1

您实际上在这里有几个问题。

问题1:属性不带参数。

无法以传递字段名的方式向C#属性传递参数/参数。 有两种不同的方法可以解决此问题:

  1. 您可以创建一个索引属性(用于myObject[fieldName] = blah而不是myObject.Fields[fieldName] = blah )。 使用语法public object this[string fieldName]声明属性。
  2. 由于您的属性没有吸气剂,因此您可以将其变成具有签名public void SetField(string fieldName, object value)的单个方法,这样调用: myObject.SetField(fieldName, value)
  3. 您可以通过getter属性公开mvarFieldDatapublic Dictionary<?, ?> Fields { get { return mvarFieldData; } } public Dictionary<?, ?> Fields { 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.");

除了当前代码外,在开始检查与fieldName关联的值之前,还需要检查mvarFieldData.ContainsKey(fieldName)

  ask by jhersey29 translate from so

未解决问题?本站智能推荐:

1回复

在类中创建多个/多节点属性

我想像普通矩形一样理解并制作自己的类: 我不想使用方法,仅使用简单的属性值。 那么如何创建Width,Height等属性呢? 如果我想创建更长的链条? 例如: 等等
3回复

类和类属性 VB.NET

我被困在跟随。 我创建具有一些属性字段的类,如下所示: 当我调用这个类并将一些值传递给属性时,我希望 New 类构造函数为我创建具有空属性字段的类的新实例,但相反,我得到了与我之前传递的属性值相同的类。 这里我如何在 PageLoad 上调用类。 然后我需要从其他类读取这个值。 我应该
2回复

C#获取类声明名称

是否可以(动态)获取类的声明名称并将其作为参数传递给构造函数,以在类本身中设置name变量? 例: 结果,我希望它写成: "className" 。
3回复

C#嵌套类,清理声明

C#中是否可以整理以下类声明? 仍然保持类结构,只是清理声明。
2回复

使用子变量(或属性)定义变量

目标是具有一个具有Unit属性的变量,该变量可以通过以下方式访问: 理想情况下,变量Diae是Class Params的成员,并且应该从IParameter类继承Unit属性: 如何声明Diae变量? 这是期望的声明的准代码的片段:
2回复

C#新手问题第二部分-声明类和方法

我想更好地组织这段代码,如下所示: 在这里,在Helpers文件夹中,我创建了将处理缩略图的类和方法: 但是我收到编译错误,即Server (在bmp1.Save bmp1.Save(Server.MapPath ...行中)的ImageHelper类中)在当前上下文中不存在,
4回复

在C#中使用“小于”和“大于”符号之间的类名是什么意思?

我不明白以下的类声明: 我知道TDomainServiceContract和TDomainService是什么,但为什么它们在<和>符号之间使用?
3回复

为什么要将变量声明为以类命名的类型

以 C# 为例。 假设有一个名为 ExampleClass 的类,变量只是值。 为什么要声明一个这样的变量