我需要帮助转换VB.Net代码块到c#(设置属性与DataTable值)



我正在编写我的第一个c#应用程序,在这种情况下,它只是一个"学习练习"。这个例子是一个简化的代码块,我在VB中使用过很多次。Net,所以我知道它工作正确。这是VB代码的样子。

Public Class User
    Private Const CN_LoginId As String = "Login"
    Private Const CN_Password As String = "Password"
    Private _password As String
    Public Property Password() As String
        Get
            Return _password
        End Get
        Set(ByVal value As String)
            _password = value
        End Set
    End Property
    Public Shared Function Create(ByVal Login As String) As User
        Dim usr = New User()
        Using dt As DataTable = DAC.ExecuteDataTable("usp_PasswordSelect", _
            DAC.Parameter(CN_LoginId, Login))
            With dt.Rows(0)
                usr.Password = CStr(.Item(CN_Password))
            End With
        End Using
        Return usr
    End Function
End Class

所以在c#中,我尝试过手工转换它,并使用Telerik的在线转换实用程序,这就是我在下面发布的内容,因为我假设它更接近正确的答案,然后我自己做了什么。

public class User
{
    private const string CN_LoginId = "Login";
    private const string CN_Password = "Password";
    private string _password;
    public string Password
    {
        get { return _password; }
        set { _password = value; }
    }
    public static User Create(string Login)
    {
        object usr = new User();
        using (DataTable dt = DAC.ExecuteDataTable("usp_PasswordSelect", 
            DAC.Parameter(CN_LoginId, Login)))
        {
            {
                usr.Password = Convert.ToString(dt.Rows(0).Item(CN_Password));
            }
        }
        return usr;
    }
}

我得到的第一个错误是在这行usr。Password = Convert.ToString(dt.Rows(0). item (CN_Password));错误是"错误1 'object'不包含'Password'的定义,并且没有找到接受'object'类型的第一个参数的扩展方法'Password'(您是否缺少using指令或程序集引用?)

在这一点上,我假设当我修复第一个错误时,第二个错误就会消失。所以我的问题是如何正确地设置这个对象的属性使用c#中的数据表?

我是这样写的:

public class User
{
    private const string CN_LoginId = "Login";
    private const string CN_Password = "Password";
    public string Password { get; set; }
    public static User Create(string Login)
    {
        User usr = new User();
        using (DataTable dt = DAC.ExecuteDataTable("usp_PasswordSelect", 
            DAC.Parameter(CN_LoginId, Login)))
            {
                usr.Password = Convert.ToString(dt.Rows[0][CN_Password]);
            }
        return usr;
    }
}

一些注意事项:

  1. c#访问数组使用方括号,而不是父括号。所以Rows(0)不正确,应该是Rows[0]
  2. 我同意Bernard的观点,你应该将User对象声明为User,而不是object。您将失去对其属性的所有可见性。你也可以使用var,但如果你正在学习c#,你最好显式声明你的变量类型。它可以导致重复声明(例如User u = new User()),但至少你会清楚地看到你的变量是什么类型。
  3. 你不需要使用Item访问数组项…只要把它作为你正在处理的行元素中的元素。这就是为什么我有dt.Rows[0][CN_Password]的双数组。同样,c#使用方括号,而不是父括号来访问数组元素。
  4. 这只是一个风格的东西,但我删除了你的_password字段,只是使用了Password的自动属性。我没有看到_password在你的代码中使用,并认为它只会使事情变得混乱。自动属性有一个由编译器自动创建的后备字段,因此您不必跟踪变量和属性。如果你使用很多属性,这可以节省很多时间。

您需要声明user的类型(在您的代码中,user是一个对象,在运行时是user,但在编译时不是)。您可以执行以下操作:

var user = new User();

User user = new User();

除了注释。正如乔纳森·狄金森所说:

user.Password = dt.Rows[0]["Password"];

最新更新