문제
C# 3.0 및 .NET 3.5에서 인터페이스가 있다고 상상해보십시오.
public interface INameable
{
string Name {get;}
}
인터페이스를 구현하는 많은 불변의 클래스.
단일 확장 방법을 갖고 싶습니다
public static T Rename<T>(this T obj) where T : INameable
{
...
}
이름이 변경되고 다른 모든 속성 읽기 및 메소드 호출이 원래 객체로 라우팅 된 원래 객체의 랩핑 인스턴스를 반환합니다.
모든 부주의 한 구현 유형에 대해 구현하지 않고 일반 래퍼 클래스를 얻는 방법은 무엇입니까? 그것이 가능하다고 생각하십니까?
해결책
아니요, 그렇지 않으면 가능하지 않습니다 T
인터페이스가되거나 모든 멤버 가상으로 클래스로 제한되며,이 제약 조건은 컴파일 시간에 지정할 수 없습니다 (해당 접근 방식에 만족하는 경우 런타임 확인을 작성할 수 있지만).
임의의 유형을 위해 할 수없는 이유는 유형의 대상을 취하는 경우 T
그런 다음 할당 할 수있는 객체를 반환해야합니다. T
. 다음과 같이 보이는 객체를 전달하면 ...
public sealed class SomeClass : INameable
{
public string Name { get; }
public string Abc { get; }
}
... 그런 다음 할당 할 수있는 다른 유형을 만들 수있는 방법이 없습니다. SomeClass
. 사용하지 않습니다 Reflection.Emit
또는 유형이 밀봉되어 있기 때문에 다른 방법.
그러나 내가 언급 한 제한에 만족한다면 Castle DynamicProxy 프레임 워크와 같은 것을 사용하여 전달 된 객체를 프록시하는 유형을 만들고 적절하게 전달 또는 재 구현을 위해 호출을 가로 채는 유형을 만들 수 있습니다.
다른 팁
그렇습니다. 가능하지만 메모리에서 코드를 생성하는 것이 포함됩니다.
많은 코드가 포함됩니다.
즉, 내가 당신을 올바르게 이해한다고 가정하면.
다음은 내가 요구하는 것입니다.
SomeNameableObject a1 = new SomeNameableObject("ThisIsTheFirstName");
SomeNameableObject a2 = a1.Rename("ThisIsTheSecondName");
// a1 works, still has the name ThisIsTheFirstName
// a2 works, but everything is routed to a1,
// except for the name, which is ThisIsTheSecondName
그 맞습니까?