我有一个WebMethod
服务于Ajax AutoComplete Extender,因为它是DataSource。
FontnmsList_AutCpltDataSrc()
所以它必须是static
,...除非我通过另一种方法实现它......例如Web Service
,因为我不想使用,实际上,那不是无论如何这里都有问题。
所以...是一个静态方法,它需要与当前应用程序的其余数据共同工作...... 不是静态的 .. ..这里有点问题..
现在我被建议一般不使用静态(引用asp.net
),并且在尝试遵循该建议时,
我可以看到,为了允许与它进行交互...... web方法有点引导我将所有其他应用程序元素/数据类型和方法转换为使用static
修饰符,例如,
这是我遇到的当前项目的一个例子。
// non static
public SeSn.CurrentSesionVariablsTmplt ExtractSesnVar()
{
SeSn.CurrentSesionVariablsTmplt RetrndAppGlobals = SeSn.GetValueAS.ACloneOfGlobalsObj("_CurrentSesionGlobals");
return (SeSn.CurrentSesionVariablsTmplt)RetrndAppGlobals ;
}
现在这是负责自动填充扩展程序的Web方法
public static List<string> FntsList = new List<string>();
[System.Web.Script.Services.ScriptMethod()]
[System.Web.Services.WebMethod(EnableSession = true)]
public static List<string> FontnmsList_AutCpltDataSrc(string prefixText)
{
if (ExtrctSesnVar().Fntlist != null)
{
//here too , non of these are , except for the List of course
FntsList = RflectMeths.ClassFldsAsList<fntNams>();
CurrSesnDatabag.Fntlist = FntsList;
SeSn.Modify(Act.Add, App.VarNms._CurrentSesionGlobals, CurrSesnDatabag);
}
else
FntsList = ExtractSesnVar().Fntlist;
return AutoComplete.FromListStr(prefixText, FntsList);
}
因此
中的工作需要非静态ExtractSesnVar()
static
网络方法FontnmsList_AutCpltDataSrc()
范围。
所以这让我很奇怪...... 我在这里缺乏什么基础知识(: 我的意思是,当你开始学习.net时,你有没有进入这个交界处?
以及所谓的真实问题:
作为这种情况的解决方案的工作是什么,(它只有一个例子。因为应该有许多其他'结点',你可以提出这样的结合)
我认为应该有某种方式,在写这两个实体之间的bridge
我可以想到传递非静态数据作为参数,
所以我在这里缺少什么。对于上面的子喷射代码,正确的解决方案是什么?
答案 0 :(得分:1)
我假设您在问:如何从静态方法调用实例方法?
只有3个选项:
有时,实例方法只需要实例中的1个或者2个状态信息,在这种情况下,更容易将它们变为静态,并且实例方法使用额外的状态信息来调用静态方法。检查这是否是这种情况。
例如,假设你有一个非常简单的类:public class something
{
public int One { get;set; }
public int Two { get;set; }
public int Add()
{
return One + Two;
}
}
并且您有一个需要调用Add的静态方法,您可以将上面的代码重构为下面的代码,这样您就不必再在静态方法中创建实例了,但仍然在一个地方添加了逻辑:
public class something
{
public int One { get;set; }
public int Two { get;set; }
public int Add()
{
return Add(One, Two);
}
internal static int Add(int one, int two)
{
return one + two;
}
}
我选择将静态Add方法设置为内部,因此只有程序集和友元组件中的其他类可以调用它。如果在您的场景中有意义,请随意将其公之于众。
这些都不是理想的,但在您的情况下可能是值得的。 YMMV。