10

今日、会社のソリューションを構築しようとしているときに興味深い問題に直面しました。なぜこれが起こっているのか知っていますか?他の人は同じ問題を抱えていなかったので、私のマシン/ビジュアルスタジオからのものである可能性があると言われました.

したがって、 project にメソッドがありますA

private static string RpcRoutingKeyNamingConvention(Type messageType, ITypeNameSerializer typeNameSerializer)
{
   string queueName = typeNameSerializer.Serialize(messageType);

   return messageType.GetAttribute<GlobalRPCRequest>() != null || AvailabilityZone == null
        ? queueName
        : queueName + "_" + AvailabilityZone;
}

GetAttribute<GlobalRPCRequest>()定義されている場所public static class ReflectionHelpers

 public static TAttribute GetAttribute<TAttribute>(this Type type) where TAttribute : Attribute;

B次に、メソッドを持つプロジェクトがあります。

public static string GetAttribute(this XElement node, string name)
{
   var xa = node.Attribute(name);
   return xa != null ? xa.Value : "";
}

Bproject内の projectへの参照があることを指摘する必要がありますA。ビルドしようとすると、コンパイルエラーが発生します。

エラー 966 型 'System.Xml.Linq.XElement' は、参照されていないアセンブリで定義されています。アセンブリ 'System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' への参照を追加する必要があります。D:\Repositories\website\website\submodules\core\src\A\Extensions\Extensions.cs 37 13 A

何が起こっているのかというと、コンパイラーは、私が実際にGetAttributeプロジェクトのメソッドを使用していると考えているということですB(私の意見では!)。なぜこれが起こっているのですか?GetAttributeVSに移動しようとすると、正しい方法(にある方法)にたどり着きReflectionHelpersます。反射のせいだろうか。: メソッドを静的に呼び出すか、プロジェクトで System.Xml.Linq への参照を追加することでこの問題を修正しましたAが、VS/構文チェック機能の奇妙な動作に興味があります。

4

3 に答える 3

1

Visual Studio は常に混乱します。VS 2015 (.NET 4.6) でシナリオを再現しようとしましたが、問題なくコンパイルされました。プロジェクト A に System.Xml.Linq への参照を追加する必要はありませんでした。

私の推測では、キャッシュの問題である可能性があります。これを試してみてください:

  1. プロジェクト B への参照を削除
  2. 両方のソリューションを消去して再構築する
  3. 参照を追加し直す
  4. 再構築して出来上がり!! まあ..うまくいけば

それが役立つことを願って、私に知らせてください:)

于 2016-04-21T10:53:10.750 に答える
1

推測ですが、あなたの機能は次のとおりです。

private static string RpcRoutingKeyNamingConvention(Type messageType, ITypeNameSerializer typeNameSerializer)文字列を返そうとしているため、ヘルパー メソッドのシグネチャと一致しません。

public static TAttribute GetAttribute<TAttribute>(this Type type) where TAttribute : Attribute;TAttribute 戻り値の型が必要です。

おそらく、関数RpcRoutingKeyNamingConventionを変更して戻りGlobalRPCRequest、コンパイラが引き続き狂っているかどうかを確認してみてください。

于 2016-04-21T02:46:35.147 に答える