gpt4 book ai didi

c# - 如何使用反射获取抽象 "const"属性的值?

转载 作者:太空宇宙 更新时间:2023-11-03 22:04:53 27 4
gpt4 key购买 nike

我有一个这样定义的类:

public abstract class Uniform<T>
{
public abstract string GlslType { get; }
...
}

然后是这样定义的子类:

public class UniformInt : Uniform<int>
{
public override string GlslType
{
get { return "int"; }
}
}

然后其他地方的方法看起来像这样:

    public static string GetCode<T>()
{
var sb = new StringBuilder();
var type = typeof(T);
sb.AppendFormat("struct {0} {{\n", type.Name);
var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance);
foreach(var f in fields)
{
sb.AppendFormat(" {0} {1};\n", f.FieldType.GetProperty("GlslType").GetValue(???), f.Name);
}
...
}

我在填写 ??? 时遇到问题秒。我相信GetValue期望对象的一个​​实例,但我真的不在乎它是什么实例,因为它们都返回相同的值。 AFAIK 没有 public abstract static readonly 这样的东西值,所以我必须使用属性。

那么我可以用什么来代替那些 ??? s 返回“int”(假设其中一个字段是 UniformInt )。

作为一个方面:我怎样才能限制fields仅继承 Uniform<> 的字段类型?

最佳答案

你需要一个 UniformInt 的实例来获取非静态属性的值:

UniformInt someUniformInt = ...
f.FieldType.GetProperty("GlslType").GetValue(someUniformInt, null)

As a side: How can I limit fields to only field types that inherit Uniform?

bool isDerivesFromUniformOfInt = typeof(Uniform<int>)
.IsAssignableFrom(f.FieldType);

或者如果你事先不知道T的类型:

bool isDerivesFromUniformOfT = typeof(Uniform<>)
.MakeGenericType(typeof(T))
.IsAssignableFrom(f.FieldType);

关于c# - 如何使用反射获取抽象 "const"属性的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8799878/

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