1

我有一个WebMethod 服务于 Ajax 自动完成扩展器的数据源。

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 时,你有没有进入这个路口?

至于所谓的 SO A Real Question :

作为这种情况的解决方案的解决方法是什么,(它只是一个例子。因为应该有许多其他像这样的“路口”,你可以想出)

我应该认为应该有某种方式,bridge在这两个实体之间,在写作时我可以考虑传入非静态数据作为参数,

所以我在这里想念什么。对于上面的 subjetced 代码,正确的解决方案是什么?

4

1 回答 1

1

我假设您在问:如何从静态方法调用实例方法?

只有3个选项:

  1. 您可以创建具有所需方法的对象的单个静态实例。这仅在此实例可以重置或不保持任何状态时才有效。
  2. 您在每次调用时创建一个新实例并使用它。
  3. 让一切静止。(不建议)

有时,实例方法只需要来自实例的 1 条或 2 条状态信息,在这些情况下,将它们转换为静态并让实例方法使用额外的状态信息调用静态方法会更容易。检查是否是这种情况。

例如,假设您有一个非常简单的类,如下所示:

public class something
{
  public int One { get;set; }
  public int Two { get;set; }

  public int Add()
  {
    return One + Two;
  }
}

并且您有一个需要调用 Add 的静态方法,您可以将上面的代码重构为下面的代码,这样您就不必再在静态方法中创建实例,但仍将 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。

于 2012-12-17T00:14:12.987 回答