简体   繁体   中英

Instance Member issue concerning a public method in a public class

Inside of a public class:

    public static class LogReporting

I have the following method:

    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);
        }

However it will not allow me to compile citing that RunTimerJobs() "cannot declare instance members in a static class" To my knowledge, none of the 'instance members' I declare are able to be labeled as static , so is there just a fundamental issue with the setup (ie a static class) or am I missing some little snippet?

The compiler's being pretty clear here. You're declaring a static class, and static classes can only contain static members. So this is okay:

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

And this is okay:

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

But this isn't:

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

If you wanted to declare instance members, why did you declare LogReporting as a static class?

When class marked as static , then all it's members should be static (instances creation is not allowed). You can read more about static classes on msdn .

So, if you want to have instance (non-static) method, then remove static keyword from class definition:

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

In this case you should create LogReporting instance to call your method:

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

Another option for you - making your method static :

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

In this case you don't need instance of LogReporting :

LogReporting.RunTimerJobs();

Your class is static thus you cannot have any instance members because you will never instantiate the class.

To be able to use the RunTimerJobs() method you would need to create an instance of the LogReporting class, ie

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

This obviously won't work though because your class is defined as static and you cannot create instances of it.

Either make your method static or remove the static keyword from your class declaration - depending on what you require.

I see no instance related logic in your method so it should be safe to mark it as static .

Remember

Classes can have a mixture of instance and static members as long as the class isn't marked static .

And

Only mark classes as static when you know that ALL members (properties, methods etc...) will be static as well.

你试过了吗:

public static void RunTimerJobs()

For a static class, the members must also be static. If you are unable make the members static, then you must make the class non-static as well.

It's generally a good idea to use non-static classes if you can, as static classes increase the complexity of unit testing as they cannot be mocked out easily. Of course if you have a legitimate need to use a static class, then by all means do so.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM