通过属性检索进程

时间:2012-05-28 08:11:58

标签: c#

我正在尝试在Windows服务中的主类中定义一个属性。该属性将用于在需要时检索进程的名称。

例如:

public string PName
{
return SomeProcess.Name;
}

public string PID
{
return SomeProcess.ProcessId;
}

public Process SomeProcess
{
private Process[] myProcess = Process.GetProcessesByName("notepad"); //Process is underlined here with red wavy line saying "A get or set accessor method is expected"
get
{return myProcess[0];}
}

问题出在注释中写入的SomeProcess属性中。我在这里做错了什么?

5 个答案:

答案 0 :(得分:4)

像这样:

private Process[] myProcess = Process.GetProcessesByName("notepad"); 
public Process SomeProcess
{
   get
   {
        return myProcess[0];
   }
}

public Process SomeProcess
{
   get
   {
        Process[] myProcess = Process.GetProcessesByName("notepad"); 
        return myProcess[0];
   }
}

修改

请注意,您需要决定何时获取流程。如果按照我在第一个示例中显示的那样执行,则在实例化类时将检索该进程。第二种方式更强大,因为它会在您询问属性的值时检索进程。

我说明了这两个答案,因为您询问了错误的含义,更多的是私有和局部变量。

答案 1 :(得分:1)

试试这个:

public Process SomeProcess
{
    get
    {
        Process[] myProcess = Process.GetProcessesByName("notepad");
        return myProcess[0];
    }
}

或者这个:

private Process[] myProcess = Process.GetProcessesByName("notepad");

public Process SomeProcess
{
    get
    {
        return myProcess[0];
    }
}

myProcess的getter中声明SomeProcess作为局部变量,或者如果要在类的其他地方使用它,则将其声明为类中的私有字段。您可以在字段/方法/类上使用访问器(私有/公共/等),而不是在局部变量上使用。

答案 2 :(得分:0)

访问者(public / private / protected / internal)不能应用于函数局部变量。

Restrictions on Using Accessibility levels

答案 3 :(得分:0)

如果要在属性中的get方法内声明私有变量声明。 根据您的代码,您需要在访问GetProcessesByName之前检查myProcess[0]是否返回进程。您可以使用下面的FirstOrDefault来避免所有这些验证。如果没有结果,它将返回null。

public Process SomeProcess
{
   get
   {
        return Process.GetProcessesByName("notepad").FirstOrDefault();
   }
}

其他属性也存在问题。您访问SomeProcess的属性而不检查null。

public string PName
{
     return SomeProcess==null? string.Empty:SomeProcess.Name;
}

public string PID
{
     return SomeProcess==null? string.Empty:SomeProcess.ProcessId;
}

答案 4 :(得分:0)

我认为你处于初级水平,你应该参考语言代码的语法,找到下面的C#代码

 public class ProcessInfo
{
    private Process[] myProcess = Process.GetProcessesByName("notepad"); //Process is underlined here with red wavy line saying "A get or set accessor method is expected" 
    public Process SomeProcess
    {
        get
        {
            return myProcess[0];
        }
    }

    public string PName
    {
        get
        {
            return SomeProcess.ProcessName;
        }
    }

    public int PID
    {
        get
        {
            return SomeProcess.Id;
        }

    }
}