2010-08-23 5 views
0

나는이 클래스를 가지고있다. GetText가 호출되면이 호출을 가로 채기를 원합니다.C# 4 인터셉트 메소드 호출

public T MethodWasCalled<T>(MethodInfo method) { 
    if(Cache.Contains(method.Name)) { 
     return Cache[method.Name] as T; 
    } 
    else { 
     T result = method.Invoke(); 
     Cache.Add(method.Name, result); 
     return result; 
    } 
} 

나는 위의 내용이 내가 원하는 것을 설명하기를 바랍니다. 이것을위한 좋은 전략은 무엇입니까?

답변

2

PostSharp 님의 Boundry Aspect가 필요할 수도 있습니다.

일부 정교화 :

PostSharp 일반 .NET의 범위 내에서 availiable없는 기능을 노출하는 컴파일시에 바이너리로 IL를 주입 빌드 프로세스 라이브러리입니다.

Boundry Aspect를 사용하면 멤버 액세스 전후에 코드를 실행할 수 있습니다. 인 - 효과 "포장", 당신은 멋진 논리를하게.

2

.NET 4를 사용하는 경우 Lazy<T>을 살펴보십시오.

public class MyClass { 
    private Lazy<string> _text = new Lazy<string>(
     () => { 
      return "text"; // expensive calculation goes here 
     }); 

    public string GetText() { 
     return _text.Value; 
    } 
} 

람다 내부의 코드는 한 번만 실행됩니다. 기본적으로 스레드 세이프입니다.

+0

Doh, 나는 이것을 항상 사용합니다! – ChaosPandion