2010-04-06 4 views
25

가능한 중복 :
Making a generic property일반 속성

내가 그렇게하지만, 내가 뭘하고 싶은 것은 특별한 유형을 만드는 것입니다하는 방법을 아주 잘 모르겠어요 getset에서 특정 작업을 수행하는 일반 속성으로 정의되며 일반 형식으로 정의됩니다. 예를 들어 이 쓸 때 :

MyProp<String> name; 

미리 정의 getset 및 문자열 값에서 수행된다.

어떻게 할 수 있습니까?

감사합니다.

+3

나는이 질문을 이해하고있다. – Amy

+1

왜 제네릭이 필요한가요? 실제로하고 싶은 일의 예를 게시 할 수 있습니까? 왜 다양한 유형으로하고 싶습니까? – Dave

+0

나는 또한 이해하지 않는다. MyProp 이름 {get {return DoCustomGet(); } {set {DoCustomSet (value); }}'작동하지 않습니까? – Jaxidian

답변

61

당신은 제네릭 클래스 다음과 같이 할 수 있습니다 :

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; } 
} 

암시 운영자가 명시 적으로 설정하거나 MyPropValue 속성을받을 필요가 없다는 것을 의미하지만, 좀 더 "자연"의 값에 액세스하는 코드를 작성할 수 있습니다 : 다음과 같이 클래스에서 사용 way :

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

나는이 문제가 "... get과 set .."에서 특정 작업을 수행 할 특별한 유형의 속성을 만들 때 취하지 않을 것이라고 생각합니다. 그러나이 질문은 실제로 명확하지 않으므로 잘못되었을 수 있습니다. –

+0

@Benjamin : 그렇습니다, 질문은 약간 불분명합니다. 그러나 그것은 바로 '여기에 원하는 논리를 삽입하십시오'코멘트가 내 코드 샘플에서 그림으로 들어오는 곳입니다. 어떤 속성이 수행되었는지에 상관없이 getter 나 setter가 호출 될 때마다 수행 될 논리를 넣을 수 있습니다. –

+0

와우, 나는 전체 그림을보기를 완전히 놓쳤다. 저는 암묵적인 연산자의 친구가 아니지만, 당신이 질문에 잘 대답했을 것 같습니다. +1. –

2

MyProp이라는 일반 클래스를 만들어야합니다. 그런 다음, generic 유형 매개 변수에 지정된 유형 인 것처럼 값을 가져오고 설정할 수 있도록 암시 적 또는 명시 적 형변환 연산자를 추가해야합니다. 이 캐스팅 오퍼레이터는 필요한 추가 작업을 수행 할 수 있습니다.

+0

는 작동하지 않을 것입니다. 캐스트 연산자만으로도 오버로드 할 수없는 대입 연산자가 필요합니다. –

+0

@Tim : 캐스트 연산자는 두 가지 방식으로 실행됩니다. 문자열을 MyProp 에 할당 할 때 암시 적 형변환 연산자가 있으면이 문자열이 사용됩니다. –

+0

예.하지만 개발자는 여전히 MyProp 값을 가로 채지 않고도이 속성을 설정할 수 있습니다. –

1

당신은 단지 일반적인 유형을 사용하여 재산을 정상적인 방법을 선언하는 메소드를 호출 할

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

당신이 취득으로 뭔가를 할 또는 설정하는 미리 정의 된 메서드를 호출 할 경우, 속성 게터/세터를 구현 .

+0

언 바운드 제네릭 형식을 사용하여 속성을 선언 할 수도 있으므로 작업이 더 재미 있습니다. public MyType PropertyName {get; 세트; }. getter/setter를 구현하면 값의 유형은 T가되며 사용 방법에 따라 달라집니다. – dthorpe

3

이 방법으로 속성 구문을 '변경'할 수 없습니다.

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

과 일반 버전이 같을 것이다 : 당신이 할 수있는 일은 이것이다

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

좋아, 물린 것이다. 당신은 다음과 같은 것을 원합니다 :

업데이트 : 저는 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에서 템플릿/스 니펫 지원을 찾으십시오.

+0

+1 가장 논리적 인 결론. – leppie

1
public class MyProp<T> 
{ 
... 
} 

public class ClassThatUsesMyProp 
{ 
public MyProp<String> SomeProperty { get; set; } 
} 
관련 문제