2012-05-10 2 views
1

Я создал класс, называемый ProfileHelper, и я не могу понять, что мои get/set accessors правильные; вместо этого, я получаю красные линии как для получения, так и для набора. Вот код, который я пытаюсь использовать:get/set Accessors the correct scope

public static String UserName(string columnName) 
{ 
    get 
    { 
     using (SqlConnection cn = new SqlConnection(SiteConfig.ConnectionString)) 
     { 
      string sSql = ("SELECT UserName , LoweredUserName FROM aspnet_Users WHERE UserId = @UserId"); 

      using (SqlCommand cm = new SqlCommand(sSql, cn)) 
      { 
       cm.Parameters.AddWithValue("@UserId", Membership.GetUser().ProviderUserKey.ToString()); 
       cn.Open(); 
       using (SqlDataReader rd = cm.ExecuteReader()) 
       { 
        while (rd.Read()) 
        { 
         return columnName; 
        } 
        rd.Close(); 
       } 
       cn.Close(); 
      }   
     }    
     return columnName; 
    } 
    set 
    { 
     using (SqlConnection cn = new SqlConnection(SiteConfig.ConnectionString)) 
     { 
      string sSql = ("UPDATE [aspnet_ Users] SET UserName = @UserName, LoweredUserName = @LoweredUserName WHERE UserId = @UserId"); 

      using (SqlCommand cm = new SqlCommand(sSql, cn)) 
      { 
       cm.Parameters.AddWithValue("@UserId", Membership.GetUser().ProviderUserKey.ToString()); 
       cn.Open(); 
       cm.ExecuteNonQuery(); 
       cn.Close(); 
      }  
     } 
    } 
} 
+4

Пожалуйста, отредактируйте ваше сообщение, а не помещайте код в свои комментарии. Также укажите дополнительную информацию. Какая ошибка вы получаете, что вы пробовали. – TJHeuvel

+8

Свойства не должны обращаться к базе данных. Они должны быть простыми - делать очень мало работы. – Oded

+1

Вы действительно не должны делать так много работы в своих геттерах и сеттерах. – CodeCaster

ответ

7

Синтаксис в основном:

private string userName; 
public string UserName // no parameter here! 
{ 
    get { return this.userName; } 
    set { this.userName = value; } // value is a keyword 
} 

В качестве альтернативы, авто-свойство сделать поле подкладочный для вас:

public string UserName { get; set; } // equivalent 
public string MyExternallyReadOnly { get; private set; } // setter is private 

Вы должны не скрипку вокруг с соединениями SQL в свойствах. Доступ к свойствам должен быть быстрым и надежным. Попробуйте заменить его методами, чтобы понять, что это на самом деле является более прочным действие с внешними зависимостями (что более вероятно, потерпит неудачу):

public string GetUserName() { } 
public void UpdateUserName() {} 
+0

где я буду использовать этот метод? в моем профиле? – blanket

+0

Где бы вы ни использовали свойство 'UserName'. Я отредактировал свой ответ, надеюсь, теперь он станет понятнее. –

+0

да, это совершенно ясно, с другой стороны мне нужно вызвать метод на моей странице профиля, используя класс-помощник, где я создал метод под названием Public Static String username (string ColumnName) {}, используя запрос выбора и обновления. Я не понимаю, как я могу использовать get/set и где? – blanket

8

Это метод, а не свойство. Только свойства имеют и устанавливают аксессоры. Выбери один.

public static String UserName(string columnName) // this implies a method 
    { 
     get // this implies a property 
     { 
+0

Конечно, если он хочет раздельный код getter и setter, и если он все еще хочет параметр 'columnName', он может написать индекс. Индексатор похож на свойство, но может принимать один или несколько параметров. (Конечно, у установщика есть дополнительный «невидимый» параметр 'значение'.) Не то, что я рекомендую использовать индекс в этом случае, но он уверен, что это один вид гибрида между методом и свойством. –

2

Вы должны сделать пару методов, GetUserName(string columnName) и SetUserName(string columnName, string value). Это предпочтительный подход, когда это, вероятно, займет некоторое время, например. потому что вы создаете соединение с БД и легко можете иметь параметр.

public static String UserName(string columnName) - подпись для метода. public static String UserName будет собственностью. Свойства имеют get/set accessors, а методы - нет. Вам нужно изменить это. Свойства не допускают аргументов, за исключением indexed properties, который не может быть статическим (например, используется как myObj[someColumnName], объявленный как public string this[string columnName]). Если вы ожидаете получить доступ к свойству, например var something = ProfileHelper.UserName;, просто используйте свойство.

Смежные вопросы