所以今天我在尝试建立公司解决方案时遇到了一些有趣的问题,我想问你们,你们知道为什么会这样吗?我被告知它可能来自我的机器/视觉工作室,因为其他人没有同样的问题。
所以我们在项目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 : "";
}
我必须指出,我们在项目B
中引用了项目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
方法(在我看来!)。为什么会这样?因为当我尝试导航到GetAttribute
VS时,我会使用正确的方法(ReflectionHelpers
中的方法)。
可能是因为反思? 注意:我通过静态调用方法或在项目A
中添加对System.Xml.Linq的引用来修复此问题,但我很好奇VS /语法检查的奇怪行为特征
答案 0 :(得分:1)
这是一个猜测,但我认为你的功能:
private static string RpcRoutingKeyNamingConvention(Type messageType, ITypeNameSerializer typeNameSerializer)
与您的助手方法签名不匹配,因为您尝试返回字符串:
public static TAttribute GetAttribute<TAttribute>(this Type type) where TAttribute : Attribute;
需要TAttribute返回类型。
也许,您可以尝试修改函数RpcRoutingKeyNamingConvention
以返回GlobalRPCRequest
并检查编译器是否继续发疯。
答案 1 :(得分:1)
Visual Studio一直都很困惑!我试图在我的VS 2015(.NET 4.6)中重现这个场景,它编译得很好。我没有在项目A中添加对System.Xml.Linq的引用。
我的猜测是它可能是一个缓存问题。你可能想试试这个:
希望它有所帮助,让我知道:)。
答案 2 :(得分:0)
我想这是在继续:
- B引用了System.Xml.Linq
- B没有问题
- 您在A中引用B
- A没有引用System.Xml.Linq
- 似乎消耗了B中定义的功能
- 当您尝试构建项目A时,会产生该错误
我是对的吗?
如果是这样的话,这是完全正常的。因为使用引用(A)的项目必须通过它引用的内容(B)引用引用的内容(System.Xml.Linq)。
这样想:当你尝试将nuget包添加到你的项目中时,如果它有一个依赖项,nuget也会安装它。为什么?因为这种情况。
如果我理解你的答案,这是完全正常的。