C# 如果B extn方法是';在图书馆A&;它';我的客户使用的图书馆是什么?
我有:C# 如果B extn方法是';在图书馆A&;它';我的客户使用的图书馆是什么?,c#,.net,assemblies,extension-methods,C#,.net,Assemblies,Extension Methods,我有: 主程序类-使用库A 库A-具有与库B中的方法混合的部分类 库B-混合方法和接口 为什么我需要一个对LibaryB的using语句来让它们的扩展方法在主类中工作呢?这是因为库B定义了要扩展的类 编辑-除代码外 // *** PROGRAM *** using TopologyDAL; using Topology; // *** THIS WAS NEEDED TO GET EXTN METHODS APPEARING *** class Progra
- 主程序类-使用库A
- 库A-具有与库B中的方法混合的部分类
- 库B-混合方法和接口
// *** PROGRAM ***
using TopologyDAL;
using Topology; // *** THIS WAS NEEDED TO GET EXTN METHODS APPEARING ***
class Program
{
static void Main(string[] args)
{
var context = new Model1Container();
Node myNode; // ** trying to get myNode mixin methods to appear seems to need using line to point to Library B ***
}
}
// ** LIBRARY A
namespace TopologyDAL
{
public partial class Node
{
// Auto generated from EF
}
public partial class Node : INode<int> // to add extension methods from Library B
{
public int Key
}
}
// ** LIBRARY B
namespace ToplogyLibrary
{
public static class NodeExtns
{
public static void FromNodeMixin<T>(this INode<T> node) {
// XXXX
}
}
public interface INode<T>
{
// Properties
T Key { get; }
// Methods
}
/***程序***
使用拓扑学;
使用拓扑;//**这是使EXTN方法出现所必需的***
班级计划
{
静态void Main(字符串[]参数)
{
var context=new Model1Container();
Node myNode;//**试图让myNode mixin方法出现似乎需要使用行来指向库B***
}
}
//**图书馆A
名称空间拓扑
{
公共部分类节点
{
//从EF自动生成
}
公共分部类节点:INode//从库B添加扩展方法
{
公钥
}
}
//**图书馆B
命名空间ToplogyLibrary
{
公共静态类NodeExtns
{
nodeMixin(此INode节点)中的公共静态无效{
//XXXX
}
}
公共接口节点
{
//性质
T键{get;}
//方法
}
}扩展方法只有在导入它们在中定义的命名空间时才可用 否则,编译器将需要针对每个引用库中的每个扩展方法进行解析,这将减慢编译时间。
此外,如果不同的命名空间包含具有相同签名的扩展方法,则无法使用扩展方法
总之,扩展方法本身就是特性,需要导入它们的名称空间;它们不会与它们扩展的类的命名空间一起自动导入。扩展方法仅在导入它们在中定义的命名空间时可用 否则,编译器将需要针对每个引用库中的每个扩展方法进行解析,这将减慢编译时间。
此外,如果不同的命名空间包含具有相同签名的扩展方法,则无法使用扩展方法
总之,扩展方法本身就是特性,需要导入它们的名称空间;它们不会与它们扩展的类的命名空间一起自动导入。这对于扩展方法来说是一个不幸的可发现性问题。为了使它们可用,您需要为包含具有扩展的静态类的名称空间添加
using
语句。看看这个关于扩展方法的文章
以下是有关扩展方法的详细信息:
那么编译器如何知道
要绑定的扩展方法?编译程序
在中查找扩展方法
调用被调用时最内部的命名空间
为扩展方法制作,然后在
由导入的所有名称空间
“使用”条款。这个过程是
然后向外移动直到我们到达
最顶层的命名空间
因为扩展方法可以
由导入到当前上下文中
“使用”条款,并受任何
可分配的对象(参见
兑换部分(详细信息)至
实例参数,各种
有趣的可能性为我们打开了大门
扩展由
类型。这可以简单地通过以下方式实现:
导入扩展库
方法,并将这些方法当作
它们是在您创建的类型上声明的
不要拥有。这意味着
语句。由于可以在不同名称空间的不同类中定义多个,编译器需要一种解决歧义的方法
我设想在将来的VisualStudio将添加一个特性,以便在键入方法名时导入正确的名称空间,方法名的导入方式与类和接口名的导入方式类似
考虑以下情况:
namespace FruityNamespace {
public static class FruityExtensions {
public static string ToFunString(this int value) {return value + " bananas"; }
}
}
namespace VegetablNamespace {
public static class VegetablyExtensions {
public static string ToFunString(this int value) {return value + " carrots"; }
}
}
//In some other source file
static void Main(/**/) {
int things = 3;
3.ToFunString(); //error CS1061: 'System.Int' does not contain a definition for 'ToFunString' and no extension method 'ToFunString' accepting a first argument of type 'System.Int' could be found (are you missing a using directive or an assembly reference?)
}
为了使用这些扩展方法中的任何一种,您需要导入正确的命名空间:
using FruityNamespace;
//OR
using VegetablyNamespace;
您可能会问,导入两个名称空间时会发生什么情况。您会遇到如下编译器错误:
错误CS0121:以下方法或属性之间的调用不明确:“VegetablNamespace.VegetablyExtensions.ToFunString(int)”和“FROUTHYNAMESPACE.FROUTHYEXTENSIONS.ToFunString(int)”
对于扩展方法来说,这是一个不幸的可发现性问题。为了使它们可用,您需要为包含具有扩展的静态类的名称空间添加using
语句。看看这个关于扩展方法的文章
以下是有关扩展方法的详细信息:
那么编译器如何知道
要绑定的扩展方法?编译程序
在中查找扩展方法
调用被调用时最内部的命名空间
为扩展方法制作,然后在
由导入的所有名称空间
“使用”条款。这个过程是
然后向外移动直到我们到达
最顶层的命名空间
因为扩展方法可以
由导入到当前上下文中
“使用”条款,并受任何
可分配的对象(参见
兑换部分(详细信息)至
实例参数,各种
有趣的可能性为我们打开了大门
扩展由
T
error CS0121: The call is ambiguous between the following methods or properties: 'VegetablNamespace.VegetablyExtensions.ToFunString(int)' and 'FruityNamespace.FruityExtensions.ToFunString(int)'