我需要帮助将VB.Net代码块转换为C#(使用DataTable值设置属性)

时间:2011-08-23 19:27:18

标签: c#

我正在编写我的第一个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'对象'不包含'密码'的定义,并且没有扩展方法'密码'接受类型'对象'的第一个参数可以找到(您是否缺少using指令或程序集引用?)

此时我假设第二个错误将在我修复第一个错误时消失。所以我的问题是如何使用C#中的DataTable正确设置此Object的属性?

2 个答案:

答案 0 :(得分:1)

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

var user = new User();

User user = new User();

除了评论。 正如Jonathan Dickinson正确地说的那样,

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

应该这样做,因为这是一个索引器。

答案 1 :(得分:1)

以下是我写的方式:

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#使用方括号访问数组,而不是parens。因此Rows(0)不正确 - 应为Rows[0]
  2. 我同意Bernard的说法,您应该将User对象声明为User,而不是object。您将失去对其属性的所有可见性。您也可以使用var,但如果您正在学习C#,那么最好明确声明您的变量类型。它可以进行重复声明(例如User u = new User()),但至少你会清楚地看到变量的类型。
  3. 您不需要使用Item访问数组项...只需将其作为您正在使用的行元素中的元素。这就是为什么我有dt.Rows[0][CN_Password]的双数组。同样,C#使用方括号,而不是用于访问数组元素的parens。
  4. 这只是一种风格,但我删除了您的_password字段,并使用Password的自动属性。我没有看到你的代码中使用了_password,并认为它会让事情变得混乱。自动属性具有由编译器自动创建的后备字段,因此您不必跟踪变量和属性。如果你使用了很多属性,这可以节省大量时间。