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
类以包含静态
方法,以返回串联值,该值与散布在各个根点上的相同模式表单身份验证
的“扩展名”创建一个名称空间文件
坦率地说,不确定将编译器“心理处理”到常驻名称空间是否会有任何不同的执行
任何关于最佳方法的建议都将不胜感激
更新
根据讨论和回顾,似乎最好的方法是为每个页面继承的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() { ... }
}