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

标签 c# methods reference uwp

<分区>

我尝试使用这段代码构建一个测试应用 example

我定义了一个公共(public)类如下:

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

我一直在努力

"an object reference is required for the non-static field, method, or Property..." error.

有人可以告诉我我做错了什么吗?

最佳答案

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

把它想象成List<string> .你不能打电话

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

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

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

因此,对于您的类(class),iSpeech , 如果你声明

var mySpeechThing = new iSpeech();

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

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

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

为此,您可以输入关键字 static在这样的方法声明中:

public static async Task SpeakTextAsync(string text, MediaElement mediaElement)

然后您就可以按照您尝试的方式使用它了。

static方法不能访问非静态类属性或方法。尽管有些人可能不同意,但通常最好不要使用 static方法。他们不是邪恶的,但在你更熟悉之前我会倾向于另一种方式。

关于C# 非静态字段、方法或属性需要对象引用 - 语音合成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38406900/

相关文章:

c# - 保持事件状态并请求超时

c# - 如何在忽略特殊字符串的同时拆分字符串

c# - 计算非常大的整数

c++ - 使用 `const reference` 在显式构造函数中分配 `std::vector` 成员不是持久的

c++ - `const std::string& s = nullptr` 作为可选参数如何工作

c++ - 在 C++ 中按值传递字符串和 vector

c# - CaSTLe Windsor "Late bound"组件

Python 不允许我在类定义尚未完成时使用类内部的方法

java - 如何使用 int 返回类型方法返回 FIbonacci 序列而不使用递归?

java - 此代码片段中创建了多少个对象