1

내가 이러한 파일을 말해봐 :C# 확장 메서드의 가시성을 동일한 어셈블리의 클래스로 제한 할 수 있습니까?

MyCode.cs

namespace MyCodeNamespace 
{ 
    public class MyClass 
    { 
    //OMITTED 
    } 

    internal static class MyExtensions 
    { 
    internal static void Foo(this string str) 
    { 
     //OMITTED 
    } 
    } 
} 

OtherCode.cs

using MyCodeNamespace; 
namespace OtherCodeNamespace 
{ 
    //OMITTED 
} 

두 파일이 동일한 어셈블리의 일부입니다. Foo가 MyCode.cs에 액세스 할 수 있지만 OtherCode.cs에 액세스하지 못하게 할 수있는 방법이 있습니까? 내 질문은이 질문과 비슷합니다. C# Extension Methods only visible and accessible within one class ("private") 하지만 그 대답은 내가 찾고있는 것이 아닙니다. 위의 질문에 대한 대답에 따라 누군가가 여전히 "using"문을 추가하여 액세스 할 수 있습니다. 내 코드에 만의 확장 메서드를 만들 수있는 방법이 있습니까? 다른 곳에서는 같은 어셈블리의 다른 클래스가 아닌 다른 곳에서도 사용할 수 있습니까?

확장 메서드를 호출하기위한 구문이 유용하기 때문에 내가하는 작업에 유용 할 것이므로 (그렇지 않으면 개인 메서드 대신 대신 만들 수 있습니다), 다른 사람들이 보길 원치 않습니다. 자신이 생각하는대로하지 않을 경우 코드에서 사용하십시오. 그리고 Visual Studio의 intellisense 덕택에 현재 확장 메서드가 사용 가능한 메서드 목록에 표시됩니다 (네임 스페이스를 추가 할 수있는 옵션 포함).

+2

"하지만 난 그것을보고 그들이가하는 가정 무엇을하지 않는 경우에 자신의 코드에서 그것을 사용하는 다른 사람을 원하지 않는다"? 다른 사람이 실수를하지 못하도록 많은 노력을 기울이고 있습니다. – hometoast

+0

OtherCodeNameSpace를 부모 네임 스페이스로 만들 수 있습니까? – MikeG

+1

C#의 이름 공간은 조직적이며 접근성 제어에 아무런 역할을하지 않습니다. –

답변

1

.NET 플랫폼에는 네임 스페이스 제한 액세스 한정자와 같은 것이 없습니다. From the docs

공개 : 액세스가 제한되지 않습니다.
protected : 액세스는 포함하는 클래스에서 파생 된 포함 된 클래스 또는 유형으로 제한됩니다.
내부 : 액세스는 현재 어셈블리로 제한됩니다.
protected internal : 액세스는 현재 클래스 또는 포함 된 클래스에서 파생 된 유형으로 제한됩니다.
비공개 : 액세스가 포함 된 유형으로 제한됩니다.

그게 전부입니다. 그래서 대답은 아니요입니다.

+0

질문에 대한 업데이트 후 강조, 아니, C#을 사양, 동시에 컴파일 된 파일을 효과적으로 하나의 파일입니다. (이것은 스펙의 처음 몇 섹션에 있으며, 매우 읽기 쉽습니다.) –

+0

Darn. 아 ~. 나는 그것이 개인 정적 메서드라고 생각한다. 감사! – inejwstine

0

확장 메서드는 정적 헬퍼를 직접 호출하는 것과 같은 일리노이로 컴파일하는 의미 론적 설탕입니다.

MyExtensionMethods.DoSomething(myObject); 
myObject.DoSomething(); 

당신은 호출되는 것을 제한 할 수는 없지만, 인텔리에서 가시성을 제거 할 수 있습니다.

단순히 MyCode.cs에 사용하여 문을 추가, 다른 네임 스페이스로 확장 메서드를 이동하고 정말 경우 OtherCode.cs

[업데이트]

에 해당 네임 스페이스에 포함되지 않습니다 호출자를 제한해야 할 필요가 있습니다. 리플렉션을 사용하여 제한을 결정하고 시도 할 수는 있지만 이는 다소 과잉입니다. 이 작업을 수행하는 대신 개인 정적 도우미를 사용하는 것이 가장 좋습니다.그때는 분명 그것이 무엇을 할 -

var frame = new System.Diagnostics.StackFrame(1, false); 
var method = frame.GetMethod(); 
var type = method.DeclaringType; 
// allow|deny type