Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在另一个NS中添加方法-对象_C#_.net_Forms Authentication_.net 4.6 - Fatal编程技术网

C# 在另一个NS中添加方法-对象

C# 在另一个NS中添加方法-对象,c#,.net,forms-authentication,.net-4.6,C#,.net,Forms Authentication,.net 4.6,也许我看错了,但我已经看错了一个多小时了 我首先尝试了一种扩展方法,但效果不佳 尝试扩展FormsAuthentication类以包含静态方法,以返回串联值,该值与散布在各个根点上的相同模式 当前代码(选项2): 我唯一没有做的事情是为表单身份验证的“扩展名”创建一个名称空间文件 坦率地说,不确定将编译器“心理处理”到常驻名称空间是否会有任何不同的执行 任何关于最佳方法的建议都将不胜感激 更新 根据讨论和回顾,似乎最好的方法是为每个页面继承的Page类实现一个属性 public class We

也许我看错了,但我已经看错了一个多小时了

  • 我首先尝试了一种扩展方法,但效果不佳
  • 尝试扩展
    FormsAuthentication
    类以包含
    静态
    方法,以返回串联值,该值与散布在各个根点上的相同模式
  • 当前代码(选项2):

    我唯一没有做的事情是为
    表单身份验证
    的“扩展名”创建一个名称空间文件

    坦率地说,不确定将编译器“心理处理”到常驻名称空间是否会有任何不同的执行

    任何关于最佳方法的建议都将不胜感激

    更新 根据讨论和回顾,似乎最好的方法是为每个页面继承的Page类实现一个属性

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

    我想你想创建一个

    实际上,它们并没有真正扩展类
    以进行身份验证,因为它们驻留在自己的类中,并且完全独立于扩展类。看看这个例子:

    public static class MyExtensions
    {
        public static string FormsUserCookieName (this FormsAuthentication) {
            return FormsAuthentication.FormsCookieName + '_' + HttpContext.Current.User.Identity.Name;
        }
    }
    
    如果您包含了定义了
    MyExtensions
    的名称空间,那么现在可以像在
    FormsAuthentication
    中定义一样使用它。因此,您现在可以编写以下内容:

    myInstanceOfFormsAuthentication.FormsUserCookieName();
    
    然而,该方法并不真正属于该类,它是在
    MyExtensions
    -类中定义的,因此相当于以下内容:

    MyExtensions.FormsUserCookieName(myInstanceOfFormsAuthentication);
    
    另一种方法是简单地在
    FormsAuthentication
    周围有一个包装类:

    class FormsAuthenticationEx
    {
        public static string FormsUserCookieName() { ... }
    }
    

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

    扩展类是行不通的。类的所有零件都必须标记为部分零件,并且必须在同一部件中定义。您永远无法实现后者,因为该类定义为:

    公共密封类表单认证

    它不是局部的,与大多数.NET Framework类一样,它是密封的


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

    您读过吗?你的语法不合适。@HimBromBeere
    扩展
    很简单,但据我所知,它们只适用于基于实例的扩展,而不是静态的扩展。我需要能够向类中添加一个静态方法。这不起作用,也不可能。你不能修改一个现有的类,甚至扩展方法也不能这样做。这是我担心的……但是我如何扩展
    FormsAuthentication
    类来允许静态方法呢?如果这不可能的话,我很乐意。只是在寻找我还没有接触过的可能模式。使用.NET中的标准机制来创建扩展方法。我想,问题是我永远不会有FormsAuthentication类的实例。我想把它作为一个静态方法来做,因为所有的引用都是基于静态的。最接近的答案是,即使是包装器设计也不起作用。决定将模式集中到页面基类中。将每个页面的重复模式隔离到单个属性
    公共字符串formsusercookeName{get{return FormsAuthentication.formscookeName+'.'+User.Identity.Name;}}
    class FormsAuthenticationEx
    {
        public static string FormsUserCookieName() { ... }
    }