2013-03-22 3 views
3

Windows Store 클래스 라이브러리 (일반 )의 소스 코드를 사용하여 .NET Framework 클래스 라이브러리을 만들고 싶습니다. 이상적으로는 원래 소스 코드 파일을 수정하고 싶지 않습니다. .NET 프레임 워크 라이브러리에서 소스 코드 파일의 일부에서 .NET API에서 기존 클래스에 정적 메서드를 "추가"할 수 있습니까?

는, 정적 멤버는 일반 .NET 프레임 워크 API 및 Windows 스토어 앱을위한 .NET 모두에 정의 된 클래스에서 사용된다 API를 사용하지만 .NET Framework 멤버의 하위 집합 만 Windows 저장소에 사용할 수 있습니다.

특정 예로는 System.IO.Path입니다. GetFullPath methodWindows Store apps에는 사용할 수 없습니다.

Windows Store 클래스 라이브러리에이 메서드를 대체하고이 원본 메서드를 대신 호출 할 수 있습니다. 내 질문은, 거기에 나는 원래의 소스 코드 파일을 수정하지 않고 이것을 할 수있는 방법은 무엇입니까?

지금까지는이 문제에 대한 만족스러운 해결책을 찾을 수 없었지만 예를 들어 WindowsXP를 구현하여 Windows Store 클래스 라이브러리에 대해 해결했습니다. 다른 네임 스페이스에서 Path.GetFullPath(string) 방법 :

namespace WindowsStoreLib.System.IO { 
    public static class Path { 
     public static string GetFullPath(string path) { ... } 
    } 
} 

다음 원본 파일에서 처리기 지시문 추가 :

#if NETFX_CORE 
using Path = WindowsStoreLib.System.IO.Path; 
#endif 

하지 원래의 수정을 필요로하지 않습니다이 문제에 대한 대안 솔루션이됩니다 소스 코드 파일?

+0

라이브러리의 두 버전을 만드십시오. 하나는 필요한 것을 다시 구현하고, 다른 하나는 기본 버전을 호출하고, 다른 버전은 응용 프로그램의 버전에 따라 포함시킵니다. – millimoose

+2

짧은 대답은 : 아니오, 기존 클래스에 정적 메서드를 추가 할 수 없습니다. –

+0

@millimoose 수정없이 .NET Framework 기반 라이브러리의 원본 소스 코드를 재사용 할 수 있기를 원합니다. 예를 들어 'Path.GetFullPath()'가 사용되었습니다. –

답변

5

아니요, 간단히 말해서는 안됩니다.

다른 플랫폼에 대해 다른 구현 (#if 통해)이있는 유틸리티 클래스를 작성하는 경향이 있습니다. 그런 다음 내 핵심 코드가 유틸리티 클래스를 호출합니다.

+0

고마워, 마크. 예, 저는 보통 "유틸리티 클래스"접근법을 사용합니다. 그러나 간과했던 것을 기대했습니다. 분명히 아니지만 최소한 독립적 인 확인을 얻는 것이 좋습니다. –

0

필자는 최근에 Entity Framework 클래스에서 이와 같은 작업을 수행 해왔다. 필자는 2 필드의 특정 출력을 1로 추가해야하고 모든 업데이트에 대해 designer.cs에서이를 지웠다. 그러나 그것들은 정적 클래스 나 정적 메소드가 아니었지만 똑같은 방식으로 작동해야합니다.

확장하려는 클래스의 이름으로 새 클래스 파일을 만들고 부분 한정자를 사용하십시오.

namespace WindowsStoreLib.System.IO { 
    public partial static class Path { 

     public static string GetFullPath(string path) { ... } 
    } 
} 
+0

고마워요, @lostcny. 문제는 원래 소스 코드 파일을 수정하지 않는 한 부분 클래스 내에 있어도 해당 메서드를 참조 할 수 없거나 라이브러리를 빌드 할 수 없다는 것입니다. 수정은 제가 피하고 싶었던 것입니다. –

+0

예, 그냥 실망 시켰습니다. – lostcny

0

Marc가 말했듯이 전 처리기 지시문이 유일한 해결책 인 것 같습니다.

하지만 "정적 클래스"와 "기존 클래스"를 읽었을 때 가장 먼저 생각하는 것은 "확장 메서드"입니다. 코드가있는 네임 스페이스에서 Path의 확장 메서드를 만든 경우 어떻게됩니까?

namespace MyNamespace.WhereMyCodeIs 
{ 
    using System.IO; 

    public static class ExtensionMethods 
    { 
     public static string GetFullPath(this Path pathObject, string path) 
     { 
      // Implementation 
     } 
    } 
} 

정말 잘 될지 모르지만이 문제를 해결할만한 방법이 있을지 모르겠습니다.

+3

확장 메서드는 인스턴스에서만 작동합니다. 기존 클래스에 새로운 정적 메서드가있는 것처럼 보이도록 만들 수는 없습니다 (그러나 내가 원하는 바가 많지만). –

+0

아 맞습니다. 나는 또한 많은 경우에 그것을 바랬다. 잊어 버려! – Ucodia

+1

감사합니다. @Ucodia, 그러나 Joe가 지적했듯이 (감사합니다. Joe) 확장 메소드를 사용하려면 인스턴스가 필요합니다. 나는 그것을 고려했지만 확장 방법을 사용하여 실행 가능한 솔루션을 제시하지 못했습니다. –

관련 문제