2014-01-22 6 views
3

나는 스레드 동기화를위한 클래스를 만들었고, 모든 함수, 클래스 등에 코드를 삽입하지 않고 메소드, 클래스, 속성 등에 적용하고 싶다. 이것은해야 할 현재 구현의 예이다 :함수를 감싸는 속성?

// [LockingClassAttribute(LockingClassAttribute.WriteBlock)] 
// Not Declared But Added Since Attribute Is Applied On A Method 
public class WhatIWantExample 
{ 
    //LockingClass locker; Included In The Attribute 

    [LockingClassAttribute(LockingClassAttribute.WriteBlock)]public int function() 
    { 
     if (condition) 
      return 0; 
    } 
} 

예 3 :

public class NotWhatIWantExample 
{ 
    LockingClass locker; 
    public int function() 
    { 
     locker.EnterWriteBlock(); 
     if (condition) 
     { 
      locker.LeaveWriteBlock(); 
      return 0; 
     } 
     locker.LeaveWriteBlock(); 
     return 1; 
    } 
} 

다음 내가 예 2

가능하면 수행 할 작업의 두 가지 예입니다

[LockingClassAttribute(LockingClassAttribute.ReadWriteBlock)] 
public class WhatIWantExample 
{ 
    //LockingClass locker; Included In The Attribute 

    //Function Would Override LockingClassAttribute.ReadWriteBlock 
    [LockingClassAttribute(LockingClassAttribute.WriteBlock)]public int function() 
    { 
     if (condition) 
      return 0; 
     return 1; 
    } 
    //Would Inherit [LockingClassAttribute(LockingClassAttribute.ReadWriteBlock)] 
    public int function2() 
    { 
     if (condition) 
      return 0; 
     return 1; 
    } 
} 

이 작업을 수행 할 수 있습니까?

답변

2

이것은 aspect orientated programming의 예입니다. C#에서는 직접 사용할 수 없지만 PostSharp을 사용하면 이런 종류의 작업을 수행 할 수 있습니다.

클래스를 살펴보면 메소드를 실행하고 완료 한 후에 코드를 실행할 수 있습니다.

+0

그래서 Visual Studio 용 PostSharp 확장 프로그램이 이것을 허용합니까? – user3141117

+0

@ user3141117 - 확장 프로그램을 사용하지 않았으므로 확실히 말할 수는 없습니다. – Sean

1

이후 내용은 aspect oriented programming입니다. 나는 그것을 직접 적용한 적이 없지만 몇 가지 기성 솔루션이 있습니다. 예를 들어 참조하십시오 : Aspect Oriented Programming in C#