2013-02-27 2 views
0

Я пытаюсь изменить объект после его создания. Я хотел бы установить свойства этого объекта на -1 для int или string.empty "" для строки. Bellow - пример кода того, что у меня уже есть.Возвращенный модифицированный тип типа

class TestClassAccess{ 
    public int MyPropInt { get; set { ModifyOnAccessDenied<int>(value); } } 
    public string MyPropString { get; set { ModifyOnAccessDenied<string>(value); } } 

    public TestClassAccess() { } 

    private T ModifyOnAccessDenied<T>(T propertyToChange) { 
     var _hasAccess = false; //not really important how this is made 
     if (!_hasAccess) 
     { 
      if (propertyToChange is string) 
       propertyToChange = string.Empty; 
      else if (propertyToChange is int) 
       propertyToChange = -1; 
     }    
     return propertyToChange; 
    } 
} 

так что вопросы возникают у меня.

  1. Он не компилируется, поскольку я не могу преобразовать свойство, чтобы изменить на строку или int.
  2. Я не завязываю, если я могу использовать множество методов, подобных этому.
  3. Возможно ли это, или я буду амбициозным.

Thank.s KJ

+0

Я изменил мой ответ с методом, чтобы сделать это с дженерики. Он требует .Net 4.0, хотя – Corylulu

ответ

1

Если вы проверяете для определенных типов в родовой функции вы, вероятно, делаете что-то неправильно. В этом случае вы можете легко просто передать значение по умолчанию, вместо того, чтобы он жестко:

private T ModifyOnAccessDenied<T>(T newValue, T defaultValue) { 
    var _hasAccess = false; //not really important how this is made 
    if (!_hasAccess) 
    { 
     newValue = defaultValue; 
    }    
    return newValue; 
} 

Я также переименовал propertyToChange в newValue, потому что у вас есть в этой функции является новым значением, а не собственности.

Также ваши определения свойств не будут работать. Если вам нужно включить какую-либо логику в ваш getter или параметр, вы не можете использовать синтаксис автоматического инициализатора и должны реализовать свойство с помощью поля поддержки.

+0

Да, вы правы, гораздо лучше передать значение по умолчанию с помощью метода. Благодарю. – Kieran

1

Кажется, что нет необходимости в создании этой функции, если для каждого типа требуется определенное действие. Это кажется более подходящим.

class TestClassAccess 
    { 
     public int MyPropInt { get; set { ModifyOnAccessDenied<int>(value); } } 
     public string MyPropString { get; set { ModifyOnAccessDenied<string>(value); } } 

     public TestClassAccess() { } 

     private static volatile bool _hasAccess = false; 
     private string ModifyOnAccessDenied<string>(string propertyToChange) 
     { 
      if (!_hasAccess) 
       return string.Empty; 
      return propertyToChange; 
     } 
     private int ModifyOnAccessDenied<int>(int propertyToChange) 
     { 
      if (!_hasAccess) 
       return -1; 
      return propertyToChange; 
     } 
    } 

Однако вы можете сделать это, используя динамику, но это требует .NET 4,0

private T ModifyOnAccessDenied<T>(T propertyToChange) 
{ 
    if (!_hasAccess) 
    { 
     if (propertyToChange is string) 
      return (dynamic)string.Empty; 
     else if (propertyToChange is int) 
      return (dynamic)(int)-1; 
    } 
    return propertyToChange; 
} 

Полностью рабочий образец:

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     TestClassAccess test = new TestClassAccess(); 
     test.MyPropInt = 4; 
     test.MyPropString = "TEST"; 
     Console.WriteLine("MyPropInt {0}, MyPropString '{1}'",test.MyPropInt, test.MyPropString); 
     // Prints "MyPropInt -1, MyPropString '' 
    } 
    class TestClassAccess 
    { 
     private int myPropInt = 0; 
     public int MyPropInt { get { return myPropInt; } set { myPropInt = ModifyOnAccessDenied<int>(value); } } 
     private string myPropString = string.Empty; 
     public string MyPropString { get { return myPropString; } set { myPropString = ModifyOnAccessDenied<string>(value); } } 

     public static volatile bool _hasAccess = false; 
     private T ModifyOnAccessDenied<T>(T propertyToChange) 
     { 
      if (!_hasAccess) 
      { 
       if (propertyToChange is string) 
        return (dynamic)string.Empty; 
       else if (propertyToChange is int) 
        return (dynamic)(int)-1; 
      } 
      return propertyToChange; 
     } 
    } 
} 
Смежные вопросы