가능한 중복 :
Making a generic property일반 속성
내가 그렇게하지만, 내가 뭘하고 싶은 것은 특별한 유형을 만드는 것입니다하는 방법을 아주 잘 모르겠어요 get
및 set
에서 특정 작업을 수행하는 일반 속성으로 정의되며 일반 형식으로 정의됩니다. 예를 들어 이 쓸 때 :
MyProp<String> name;
미리 정의 get
set
및 문자열 값에서 수행된다.
어떻게 할 수 있습니까?
감사합니다.
가능한 중복 :
Making a generic property일반 속성
내가 그렇게하지만, 내가 뭘하고 싶은 것은 특별한 유형을 만드는 것입니다하는 방법을 아주 잘 모르겠어요 get
및 set
에서 특정 작업을 수행하는 일반 속성으로 정의되며 일반 형식으로 정의됩니다. 예를 들어 이 쓸 때 :
MyProp<String> name;
미리 정의 get
set
및 문자열 값에서 수행된다.
어떻게 할 수 있습니까?
감사합니다.
당신은 제네릭 클래스 다음과 같이 할 수 있습니다 :
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; }
}
암시 운영자가 명시 적으로 설정하거나 MyProp
의 Value
속성을받을 필요가 없다는 것을 의미하지만, 좀 더 "자연"의 값에 액세스하는 코드를 작성할 수 있습니다 : 다음과 같이 클래스에서 사용 way :
SomeClass instance = new SomeClass();
instance.SomeProperty = 32;
int someInt = instance.SomeProperty;
나는이 문제가 "... get과 set .."에서 특정 작업을 수행 할 특별한 유형의 속성을 만들 때 취하지 않을 것이라고 생각합니다. 그러나이 질문은 실제로 명확하지 않으므로 잘못되었을 수 있습니다. –
@Benjamin : 그렇습니다, 질문은 약간 불분명합니다. 그러나 그것은 바로 '여기에 원하는 논리를 삽입하십시오'코멘트가 내 코드 샘플에서 그림으로 들어오는 곳입니다. 어떤 속성이 수행되었는지에 상관없이 getter 나 setter가 호출 될 때마다 수행 될 논리를 넣을 수 있습니다. –
와우, 나는 전체 그림을보기를 완전히 놓쳤다. 저는 암묵적인 연산자의 친구가 아니지만, 당신이 질문에 잘 대답했을 것 같습니다. +1. –
MyProp이라는 일반 클래스를 만들어야합니다. 그런 다음, generic 유형 매개 변수에 지정된 유형 인 것처럼 값을 가져오고 설정할 수 있도록 암시 적 또는 명시 적 형변환 연산자를 추가해야합니다. 이 캐스팅 오퍼레이터는 필요한 추가 작업을 수행 할 수 있습니다.
는 작동하지 않을 것입니다. 캐스트 연산자만으로도 오버로드 할 수없는 대입 연산자가 필요합니다. –
@Tim : 캐스트 연산자는 두 가지 방식으로 실행됩니다. 문자열을 MyProp
예.하지만 개발자는 여전히 MyProp
당신은 단지 일반적인 유형을 사용하여 재산을 정상적인 방법을 선언하는 메소드를 호출 할
public MyType<string> PropertyName { get; set; }
당신이 취득으로 뭔가를 할 또는 설정하는 미리 정의 된 메서드를 호출 할 경우, 속성 게터/세터를 구현 .
언 바운드 제네릭 형식을 사용하여 속성을 선언 할 수도 있으므로 작업이 더 재미 있습니다. public MyType
이 방법으로 속성 구문을 '변경'할 수 없습니다.
class Foo
{
string MyProperty { get; set; } // auto-property with inaccessible backing field
}
과 일반 버전이 같을 것이다 : 당신이 할 수있는 일은 이것이다
은class Foo<T>
{
T MyProperty { get; set; }
}
좋아, 물린 것이다. 당신은 다음과 같은 것을 원합니다 :
업데이트 : 저는 Fredrik Mörk가 여러분의 질문에 대답하고 해결책을 제시했음을 확신합니다. 나는 그 아이디어에별로 만족하지 않지만, 당신의 질문에서 내가 이해 한 것을 정확히 대답 한 것 같습니다.
public class PropertyFoo {
public MyProp<String> Name;
}
이 정말
public class PropertyFoo {
public string Name {
get { /* do predefined stuff here */ }
set { /*other predefined stuff here */ }
}
}
번호 수 없음이 아닌 속성으로 끝납니다. IDE에서 템플릿/스 니펫 지원을 찾으십시오.
+1 가장 논리적 인 결론. – leppie
public class MyProp<T>
{
...
}
public class ClassThatUsesMyProp
{
public MyProp<String> SomeProperty { get; set; }
}
나는이 질문을 이해하고있다. – Amy
왜 제네릭이 필요한가요? 실제로하고 싶은 일의 예를 게시 할 수 있습니까? 왜 다양한 유형으로하고 싶습니까? – Dave
나는 또한 이해하지 않는다. MyProp 이름 {get {return DoCustomGet(); } {set {DoCustomSet (value); }}'작동하지 않습니까? –
Jaxidian