添加方法 - 另一个 NS 中的对象

Add Method - Object in another NS

也许我看错了,但我已经这样做了一个多小时了。

  1. 我首先尝试了一种扩展方法,但效果不佳。
  2. 尝试扩展 FormsAuthentication class 以包含一个 static 方法到 return 一个串联值,该值是散布在各个根点上的相同模式。

当前代码(选项 #2):

public partial class FormsAuthentication {
    public static string FormsUserCookieName () {
        return FormsAuthentication.FormsCookieName + '_' + HttpContext.Current.User.Identity.Name;
    }
}

我唯一没有做的事情是为要定位的 FormsAuthentication“扩展”创建一个命名空间文件。

坦率地说,不确定将编译器“心理化”到常驻命名空间中是否会有任何不同的表现。

如有任何关于最佳方法的建议,我们将不胜感激。

更新

根据讨论和审查,最好的方法似乎是为每个页面继承的页面 class 实施 属性。

public class WebsitePage : Page {
    ....
    public string FormsUserCookieName { get { return FormsAuthentication.FormsCookieName + '_' + User.Identity.Name; } }
    ....
}

我想你想创建一个 extension-method

实际上,它们并没有真正扩展 class FormsAuthentication,因为它们驻留在自己的 class 中,并且完全独立于扩展的 class。看看这个例子:

public static class MyExtensions
{
    public static string FormsUserCookieName (this FormsAuthentication) {
        return FormsAuthentication.FormsCookieName + '_' + HttpContext.Current.User.Identity.Name;
    }
}

如果您包含定义 MyExtensions 的名称空间,现在可以像 定义在 FormsAuthentication 中一样使用。因此你现在可以这样写:

myInstanceOfFormsAuthentication.FormsUserCookieName();

但是该方法并不真正属于 class,它在 MyExtensions-class 中定义,因此等同于以下内容:

MyExtensions.FormsUserCookieName(myInstanceOfFormsAuthentication);

另一种方法是简单地在 FormsAuthentication:

周围进行包装-class
class FormsAuthenticationEx
{
    public static string FormsUserCookieName() { ... }
}

这对您的 API 用户来说更清楚,因为它显示了您的扩展程序的定义位置。

扩展 class 将不起作用。 class 的所有部分都必须标记为部分,并且必须在同一程序集中定义。您永远不会实现后者,因为 class 定义为:

public sealed class FormsAuthentication

它不是部分的,并且像大多数 .NET Framework 一样class它是密封的。

您唯一的选择是创建扩展方法。