0

在公共课程内部:

    public static class LogReporting

我有以下方法:

    public void RunTimerJobs()
    {
        SPAdministrationWebApplication centralAdmin = SPAdministrationWebApplication.Local;
        try
        {
            foreach (SPService service in centralAdmin.Farm.Services)
            {
                Guid traceGuid = new Guid("d3beda82-38f4-4bc7-874f-ad45cebc9b35");
                Guid eventGuid = new Guid("3ea057b3-0391-4c33-ac8d-412aecdda97d");

                var traceJob =
                    from jobDefinition in service.JobDefinitions
                    where jobDefinition.Id == traceGuid
                    select jobDefinition;

                if (traceJob != null && traceJob.Count() == 1)
                {
                    traceJob.First().RunNow();
                }

                var eventJob =
                    from jobDefinition in service.JobDefinitions
                    where jobDefinition.Id == eventGuid
                    select jobDefinition;

                if (eventJob != null && eventJob.Count() == 1)
                {
                    eventJob.First().RunNow();
                }
            }
        }
        catch (Exception ex)
        {
            //Loggers.SharePointLogger logger = new Loggers.SharePointLogger();
            //logger.WriteTrace(ex.Message, LogProduct.MonitoringView, LogTraceSeverity.Unexpected);
        }

但是它不允许我编译引用RunTimerJobs()“不能在静态类中声明实例成员”据我所知,我声明的任何“实例成员”都不能标记为static,所以设置是否存在基本问题(即静态类)还是我错过了一些小片段?

4

5 回答 5

1

编译器在这里很清楚。您正在声明一个静态类,而静态类只能包含静态成员。所以这没关系:

public class NonStaticClass
{
    public void InstanceMethod() {}
}

这没关系:

public static class StaticClass
{
    public static void StaticMethod() {}
}

但这不是:

public static class StaticClass
{
    public void InstanceMethod() {}
}

如果要声明实例成员,为什么要声明LogReporting为静态类?

于 2012-12-06T20:52:02.957 回答
1

当类标记为static时,它的所有成员都应该是静态的(不允许创建实例)。您可以在msdn上阅读有关静态类的更多信息。

因此,如果您想要实例(非静态)方法,请从类定义中删除static关键字:

public class LogReporting
{
     public void RunTimerJobs()
     {
         //...
     }
}

在这种情况下,您应该创建LogReporting实例来调用您的方法:

LogReporting log = new LogReporting();
log.RunTimerJobs();

您的另一个选择 - 使您的方法静态

public static class LogReporting
{
     public static void RunTimerJobs()
     {
         //...
     }
}

在这种情况下,您不需要以下实例LogReporting

LogReporting.RunTimerJobs();
于 2012-12-06T20:52:06.887 回答
1

您的类是静态的,因此您不能拥有任何实例成员,因为您永远不会实例化该类。

为了能够使用RunTimerJobs()您需要创建类的方法instanceLogReporting

LogReporting logReporting = new LogReporting();
logReporting.RunTimerJobs();

这显然不起作用,因为您的类被定义为static并且您无法创建它的实例。

制定您的方法staticstatic从您的声明中删除关键字class- 取决于您的要求。

我在您的方法中没有看到与实例相关的逻辑,因此其标记为static.

记住

只要类没有标记为static ,类就可以具有实例成员和静态成员的混合。

只有当您知道所有成员(属性、方法等)也将是静态的时,才将类标记为静态。

于 2012-12-06T20:54:22.137 回答
0

你试过了吗:

public static void RunTimerJobs()

于 2012-12-06T20:52:11.070 回答
0

对于静态类,成员也必须是静态的。如果您无法将成员设为静态,那么您也必须将类设为非静态。

如果可以的话,使用非静态类通常是个好主意,因为静态类增加了单元测试的复杂性,因为它们不容易被模拟出来。当然,如果您有使用静态类的合法需求,那么请务必这样做。

于 2012-12-06T20:53:02.193 回答