2010-12-28 2 views
2

닷넷 프레임 워크에서 자동 속성에 방법을 주입하는 방법 : 나는 몇 가지 방법이나는 많은 특성을 가진 일부 클래스 푸가

public class Foo 
{ 
    public int Property1 { get; set; } 

    public int Property2 { get; set; } 

    public int Property3 { get; set; } 
} 

다른 클래스를, 예를 들어,

public void SomeMethod() 
{ 
    //... 
} 

Foo 클래스의 모든 속성 설정자에게이 메서드를 삽입하는 방법은 무엇입니까? .Net Framework 2.0을 사용합니다.

답변

0

로 출력 프레임 워크와 함께 작동해야합니다.

내 클래스 :

EasyPropBuilder epb=new EasyPropBuilder(); 
    Foo foo = epb.Build<Foo>(); 
    foo.Property1 = 1; 
    foo.PropertyChanged += OnPropertyChanged; 
    foo.Property1 = 2; 

은 또한이 같은 방법을 추가해야합니다 : 사용

[AfterPropertySetFilter(typeof(NotifyPropertyChanged))] 
public class Foo : INotifyPropertyChanged 
{ 
    public virtual int Property1 { get; set; } 

    public virtual int Property2 { get; set; } 

    public virtual int Property3 { get; set; } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

public static void OnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) 
{ 
    Console.WriteLine("Property Changed: " + propertyChangedEventArgs.PropertyName); 
} 
+0

@ rally25rs는 무엇을 제안하지 않습니까? –

+0

거의. DynamicProxy를 사용하는 방법을 알지 못했지만 EasyProp이 도움이되었습니다. – dublicator

4

리플렉션을 통해 런타임시이를 수행 할 방법이 없다고 생각합니다. 아마 AOP (aspect-oriented) 접근법을 사용하는 것이 좋겠지 만 .NET Framework에서는 실제로 지원되지 않습니다. 컴파일러 확장을 사용 하시거나 Unity2 to do AOP을 사용하시는 분이라면 PostSharp을 사용하십시오.

편집 : Castle DynamicProxy도 고려해 볼 수 있습니다. DynamicMethods 및 IL 코드를 확실하게 파악한 경우 자체 프록시 생성기 클래스를 만들 수 있습니다.

그러나 대부분의 경우 프록시를 처리하기 위해 나머지 응용 프로그램을 적절하게 코딩해야한다고 생각합니다. 대신 일을 즉, : 당신은 여기에 int 클래스의 확장을 사용할 수 있습니다

Foo f = Generator.GetProxy<Foo>(); // this code is fake. just indicates that you need to get an instance of Foo from a proxy generator, be it DynamicProxy or Unity or whatever. 
f.Property1 = 123; 
+0

Postsharp가 나는 성 DynamicProxy 사용하는, EasyProp를 사용 아마 당신이 응용 프로그램을 구조적으로 변경하여 su 이 요구 사항을 준수하십시오. –

+0

@tom - PostSharp는 런타임에 빌드 타임에 프록시 생성 및 주입을 수행 할 수 있다는 이점이 있기 때문에 PostSharp는 이미 존재하는 코드에 대해 가장 작은 변경을 요구합니다. 어떤 사람들은 컴파일러 확장을 사용하지 않으려 고했기 때문에 다른 옵션을 던졌습니다. 사이드 노트; MS는 PostSharp에 대한 권리를 사서 표준 컴파일러에 빌드해야합니다!:) – CodingWithSpike

+0

PostSharp가 문제였습니다. 그것은 System.Data.SQLite와 상호 작용하고 싶지 않습니다 : 그 어셈블리는 호환되지 않는다고 말했습니다. – dublicator

0

:

Foo f = new Foo(); 
f.Property1 = 123; 

당신은 같이해야 할 것이다. 또는 getter/setter 속성이 어떤 데이터 유형이든간에. 예를

public class Foo 
{ 
    public int Property1 { get; set; }  
    public int Property2 { get; set; }  
    public int Property3 { get; set; } 
} 

확장 방법은 .NET 2.0을 사용하는 다음 문서를 참조하십시오이

public static class IntExtension 
{ 
    public static void SomeMethod(this int property) 
    { 
     // ... 
    } 
} 

과 같을 것이다 들어

. 당신은 C# 3.0을 지원하는으로 VisualStudio를 사용하지만 여전히 나는이 작업을 수행하는 쉬운 방법을 발견 C# 2.0

Extension Method in C# 2.0

관련 문제