gpt4 book ai didi

c# - 使用通用 get 方法扩展 SerializedObject

转载 作者:太空宇宙 更新时间:2023-11-03 19:44:00 24 4
gpt4 key购买 nike

我想为 SerializedObject 编写一个通用扩展方法可以用来代替 FindProperty然后访问 whateverValue成员(member),所以我可以写so.Get<Bool>("myValue")而不是 so.FindProperty("myValue").boolValue .

如果模板专门化是 C# 中的一件事,我想通过以下方式解决此问题:

public static T Get<T>(this SerializedObject so, string name) {
Debug.LogError("Get called with unsuported type!");
}

public static bool Get<bool>(this SerializedObject so, string name) {
return so.FindProperty(name).boolValue;
}

如何在适当的 C# 中实现这样的事情?我还尝试添加 System.Type参数而不是特化,但是这样的函数的返回类型应该是什么?

最佳答案

我会使用一点函数式编程。通用函数的输入参数之一将是另一个函数,它将定义如何读取属性:

    public static T Get<T>(this SerializedObject so, string name, Func<SerializedProperty, T> getter) {
var property = so.FindProperty(name);
if (property == null) {
;//handle "not found"
}
return getter(property);
}

我将如何使用它的几个例子:

    internal bool ExampleBoolValue(SerializedObject so) {
return so.Get("myBoolValue", (p => p.boolValue));
}

internal int ExampleIntValue(SerializedObject so) {
return so.Get("myIntValue", (p => p.intValue));
}

我没有在这台机器上安装 Unity,所以我不确定 Unity 是否支持这些 .NET 功能。

更新 setter 方法:

    public static void Set(this SerializedObject so, string name, Action<SerializedProperty> setter) {
var property = so.FindProperty(name);
if (property == null) {
;//handle "not found"
}
setter(property);
}

设置值的例子:

    internal void SetExampleBoolValue(SerializedObject so, bool newValue) {
so.Set("myBoolValue", (p => p.boolValue = newValue));
}

internal void SetExampleIntValue(SerializedObject so, int newValue) {
so.Set("myIntValue", (p => p.intValue = newValue));
}

Action采用 0..n 个参数并且不返回任何内容。 Func需要 0..n 个参数并且必须返回一些东西。

关于c# - 使用通用 get 方法扩展 SerializedObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48689115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com