2010-03-20 4 views
9

속성 세트가있는 클래스가 있습니다. 아래에 나와 있습니다. 사용자가 기존 연락처를 업데이트 할 수 있도록이 클래스의속성의 C# 속성을 동적으로 제거하십시오.

class ContactInfo 
{ 
    [ReadOnly(true)] 
    [Category("Contact Info")] 
    public string Mobile { get; set; } 

    [Category("Contact Info")] 
    public string Name{ get; set; } 
} 

객체는, 속성 그리드에 할당되고있다. 모바일이 읽기 전용으로 표시되어 있음을 알 수 있습니다.

그러나 완전히 새로운 연락처을 추가하려는 경우 사용자가 연락처 모바일을 편집 할 수 있기를 바랍니다. 이를 위해서는 Readonly 속성을 동적으로 제거하여 개체를 속성 표에 할당하기 전에 Type에서을 제거해야합니다. 가능한가?

답변

7

당신은 런타임에 속성을 제거 할 수는 없지만 False로 읽기 전용 속성의 읽기 전용 개인 백업 필드를 변경하는 반사를 사용할 수 있습니다 비슷해. 그것의 상당 만들기 [읽기 전용 (거짓)]

자세한 내용은이 문서를 참조하십시오

http://codinglight.blogspot.com/2008/10/changing-attribute-parameters-at.html

편집 : 고정 링크 내가 Legenden에 의해 제안을 추적

+0

이것은 정확히 내가 원하는 내 사건이다. – SysAdmin

+0

링크가 작동하지 않습니다. – grimmig

+0

@grimmig : 고정 링크 – andreialecu

1

는 당신이이 개 수업을 할 수있는 제안으로

(실행시) dinamycally 속성을 제거하는 순간에 불가능 : 나는 OMU/승 동의해야

+1

2 개의 클래스를 만들 필요가 없습니다. reflection을 사용하여 ReadOnly 특성의 부울 필드를 수정하고이를 false (읽기 전용이 아닌)로 변경할 수 있습니다. – andreialecu

+0

흠, 좋은 전화, 나는 그것에 대해 생각하지 않았다 :) – Omu

2

없이 속성을 하나 하나; 두 개의 서로 다른 견해를 지원하기 위해이 경우 두 클래스 (뷰 모델)에 대해 실제로 말하고있는 것입니다.

CreateContactViewModel 및 EditContactViewModel

0

합니다. 여기에 내가 무엇을 생각해 냈습니다.

class ContactInfo 
{ 
     [ReadOnly(true)] 
     [Category("Contact Info")] 
     public string Mobile { get; set; } 

     [Category("Contact Info")] 
     public string Name{ get; set; } 

     public void SetMobileEdit(bool allowEdit) 
     { 
      PropertyDescriptor descriptor = TypeDescriptor.GetProperties(this.GetType())["Mobile"]; 

      ReadOnlyAttribute attrib = (ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)]; 

      FieldInfo isReadOnly = attrib.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); 

      isReadOnly.SetValue(attrib, !allowEdit); 
     } 
} 
+0

나는 이것이 작동하는 동안 좋은 디자인이 아니라고 생각합니다. 책임은 출혈입니다. – Paul

0

CodingLight.com 블로그가 blogspot (위 링크가 깨졌습니다)로 이동했습니다. http://codinglight.blogspot.com/2008/10/changing-attribute-parameters-at.html을 참조하십시오.

또한 SysAdmin의 후속 조치에서는 실제로 작동하는 솔루션에 필요한 것으로 보이는 [RefreshProperties(RefreshProperties.All)] 특성에 대해 언급하지 않았습니다. 마지막으로

, 나는 심지어 데이비드 모튼 (인용 문서의 저자가) 하나의 매우 중요한 일을 놓친 믿고 : (시스템 관리자의 후속 예 ContactInfo) 클래스가 적어도 정의 [ReadOnly] 속성을 가진 하나 개의 속성이없는 경우 컴파일 타임에 "isReadOnly"FieldInfo를 true로 설정하면 런타임에 전체 클래스이 읽기 ​​전용으로 바뀝니다.

관련 문제