Подтвердить что ты не робот

Общее свойство в С#

Возможный дубликат:
Создание общего свойства

Я не совсем уверен, как это сделать, но я хотел бы создать специальный тип свойства, который будет выполнять конкретные задачи в get и set, и будет определен на общих тип. Например, при написании этого:

MyProp<String> name;

для строкового значения будут выполняться предварительно определенные get и set.

Как это можно сделать?

Спасибо!

4b9b3361

Ответ 1

Вы можете создать общий класс следующим образом:

public class MyProp<T>
{
    private T _value;

    public T Value
    {
        get
        {
            // insert desired logic here
            return _value;
        }
        set
        {
            // insert desired logic here
            _value = value;
        }
    }

    public static implicit operator T(MyProp<T> value)
    {
        return value.Value;
    }

    public static implicit operator MyProp<T>(T value)
    {
        return new MyProp<T> { Value = value };
    }
}

... затем используйте его в таком классе:

class SomeClass
{
    public MyProp<int> SomeProperty { get; set; }
}

Неявные операторы означают, что вам не нужно явно устанавливать или получать свойство Value MyProp, но может писать код для доступа к значению более "естественным" способом:

SomeClass instance = new SomeClass();
instance.SomeProperty = 32;
int someInt = instance.SomeProperty;

Ответ 2

Вам понадобится создать общий класс с именем MyProp. Затем вам нужно будет добавить неявные или явные операторы приведения, чтобы вы могли получить и установить значение, как если бы это был тип, указанный в параметре родового типа. Эти операторы литья могут выполнить дополнительную работу, которая вам нужна.

Ответ 3

Вы не можете "изменить" синтаксис свойств таким образом. Что вы можете сделать, так это:

class Foo
{
    string MyProperty { get; set; }  // auto-property with inaccessible backing field
}

а общая версия будет выглядеть так:

class Foo<T>
{
    T MyProperty { get; set; }
}

Ответ 4

Хорошо, я буду кусать. Вы хотите что-то вроде этого: если вы объявите "свойство" следующим образом:

Обновление: Теперь я уверен, что Фредрик Мёрк ответил на ваш вопрос и дал решение. Я не очень доволен этой идеей, но, похоже, я точно понимаю, что я понял из вашего вопроса.

public class PropertyFoo {
  public MyProp<String> Name;
}

это заканчивается как

public class PropertyFoo {
  public string Name {
    get { /* do predefined stuff here */ }
    set { /*other predefined stuff here */ }
  }
}

Нет. На самом деле невозможно, а не собственность. Ищите поддержку шаблона/фрагмента в вашей среде IDE.

Ответ 5

Вы просто объявляете свойство обычным способом, используя общий тип:

public MyType<string> PropertyName { get; set; }

Если вы хотите вызвать предопределенные методы для выполнения чего-либо в get или set, используйте свойство getter/setter для вызова этих методов.

Ответ 6

public class MyProp<T>
{
...
}

public class ClassThatUsesMyProp
{
public MyProp<String> SomeProperty { get; set; }
}