4

これらのファイルがあるとします:

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
}

2 つのファイルは同じアセンブリの一部です。Foo を MyCode.cs にアクセス可能にする方法はありますが、OtherCode.cs にはアクセスできませんか? 私の質問は次の質問に似ています: C# 拡張メソッドは 1 つのクラス (「プライベート」) 内でのみ表示およびアクセスできます が、その受け入れられた答えは、私が探しているものではありません。作業中のコードにのみ表示される拡張メソッドを作成したいのですが、上記の質問への回答によると、誰かが「using」ステートメントを追加することでアクセスできます。同じアセンブリ内の別のクラスでさえ、自分のコードにのみ表示され、の場所には表示されない拡張メソッドを作成する方法はありますか?

拡張メソッドを呼び出すための構文が便利で、私が取り組んでいることに役立つのでお願いします (そうでなければ、代わりにプライベート メソッドを作成するだけです)。彼らが想定していることをしない場合に備えて、彼らのコード。Visual Studio の Intellisense のおかげで、私の拡張メソッドは現在、使用可能なメソッドのリストに表示されています (それらが含まれる名前空間を追加するオプションと共に)。

4

4 に答える 4

2

拡張メソッドは、静的ヘルパーを直接呼び出すのと同じ IL にコンパイルされるセマンティック シュガーにすぎません。

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

呼び出されることを制限することはできませんが、Intellisense からの可視性を削除できます。

拡張メソッドを別の名前空間に移動し、MyCode.cs に using ステートメントを追加し、その名前空間を OtherCode.cs に含めないでください。

[アップデート]

呼び出し元を本当に制限する必要がある場合は、リフレクションを使用して決定および制限を試みることができますが、これは少しやり過ぎです。これを行う代わりに、単純にプライベートな静的ヘルパーを使用することをお勧めします。

var frame = new System.Diagnostics.StackFrame(1, false);
var method = frame.GetMethod();
var type = method.DeclaringType;
// allow|deny type
于 2016-10-13T19:36:58.077 に答える
0

同様の問題がありました。ASP.NET Core でサービスを構成するときに、内部拡張メソッドをプログラマーに見せたくありませんでした。

私にとっての解決策Microsoft.Extensions.DependencyInjectionは、使用されている名前空間にすべての拡張メソッドを追加しStartup.cs、ユーザーがそれらのメソッドを見ることができるようにすることでした。(いつものように。)

何かを「隠したい」場合は、拡張メソッドを に追加しましたMyNamespace.Extensionsユーザーが正しい名前を書くと、使用する追加のヘルパーが表示されますが、デフォルトではリストされません。

これが解決策ではないことはわかっていますが、誰かを助けるかもしれません。

于 2018-10-05T11:51:38.767 に答える