문제

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

그 맞습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top