对于非静态字段,方法或属性 - 语音合成,需要C#对象引用

时间:2016-07-16 01:35:56

标签: c# methods reference uwp

我尝试使用此代码example

构建测试应用

我定义了一个公共类,如下所示:

 public class iSpeech
 {
    // Performs synthesis
    public async Task<IRandomAccessStream> SynthesizeTextToSpeechAsync(string text)
    {
        IRandomAccessStream stream = null;
        using (SpeechSynthesizer synthesizer = new SpeechSynthesizer())
        {
            VoiceInformation voiceInfo =
              (
                from voice in SpeechSynthesizer.AllVoices
                where voice.Gender == VoiceGender.Male
                select voice
              ).FirstOrDefault() ?? SpeechSynthesizer.DefaultVoice;

            synthesizer.Voice = voiceInfo;
            stream = await synthesizer.SynthesizeTextToStreamAsync(text);
        }
        return (stream);
    }

    // Build audio stream
    public async Task SpeakTextAsync(string text, MediaElement mediaElement)
    {
        IRandomAccessStream stream = await this.SynthesizeTextToSpeechAsync(text);
        await mediaElement.PlayStreamAsync(stream, true);
    }
}

在应用程序主页面中,我尝试调用:

    public async void btnClick(object sender, RoutedEventArgs e)
    {
        await iSpeech.SpeakTextAsync("test speech", this.uiMediaElement);
    }

我一直在

  

“非静态字段,方法或属性需要对象引用...”错误。

有人可以让我知道我做错了什么吗?

2 个答案:

答案 0 :(得分:4)

iSpeech是一个类,但您需要该类的实例才能使用非静态方法。

将其想象为List<string>。你不能打电话

List<string>.Add("Hello"); 

因为List<string>是一个类,就像创建对象的蓝图一样。 (您将得到完全相同的错误。)您需要创建该类的实例才能使用它:

var myList = new List<string>();
myList.Add("Hello");

对于您的班级iSpeech,如果您声明了

var mySpeechThing = new iSpeech();

然后mySpeechThing将是一个表示iSpeech实例的变量,然后你可以做

await mySpeechThing.SpeakTextAsync("test speech", this.uiMediaElement);

有时一个类可以在不修改对象状态的情况下调用方法(比如在Add上调用List<string>通过向其添加字符串来更改其状态。)我们将这些声明为{ {1}}方法。它们属于类,而不属于类的实例。

为此,您可以将关键字static放在方法声明中,如下所示:

static

然后你可以按照你想要的方式使用它。

public static async Task SpeakTextAsync(string text, MediaElement mediaElement) 方法无法访问非静态类属性或方法。虽然有些人可能不同意,但通常更好的做法是不使用static方法。他们不是邪恶的,但在你更熟悉之前,我会倾向于另一种方式。

答案 1 :(得分:1)

您在Method SpeakTextAsync中缺少“static”关键字。

{{1}}