Общее свойство в С#
Возможный дубликат:
Создание общего свойства
Я не совсем уверен, как это сделать, но я хотел бы создать специальный тип свойства, который будет выполнять конкретные задачи в get
и set
, и будет определен на общих тип.
Например, при написании этого:
MyProp<String> name;
для строкового значения будут выполняться предварительно определенные get
и set
.
Как это можно сделать?
Спасибо!
Ответы
Ответ 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; }
}