如何从带有约束的泛型类中获取属性的名称

问题描述 投票:0回答:1

如何从具有约束的泛型类中获取属性名称?

我有一个像这样定义的简单类:

class Simple 
{
    //...
}

我有一个泛型类,其约束定义如下:

class Generic<T> where T : Simple, new()
{
    public T SimpleObject { get; set; }

    public string Type { get; set; }
}

我想要做的是获取属性 Type 的名称。通常,我会用这行代码来完成此操作:

Console.WriteLine(nameof(Generic.Type));

但这给了我错误:“使用泛型类型需要 1 个类型参数”。在 Generic 之后添加 <> 并不能解决此问题。我也无法在 Generic 之后添加,因为对象和 Simple 类之间没有隐式引用转换。我没有想到有一种方法可以从泛型类中获取属性的名称,或者这是 nameof 的限制,在这种情况下我是否需要对属性的名称进行硬编码?

我不想在这里对名称进行硬编码的原因是因为它是一个神奇的字符串,如果我出于某种原因重命名该属性,硬编码的名称不会随之重命名,这会因明显的原因而导致错误。

更新: 在回复中,我注意到我不太清楚在哪里调用 Console.WriteLine 代码行。我想在通用类之外调用这行代码。例如在 Program.cs 或任何其他不同的类中。

c# generics
1个回答
0
投票

我刚刚看到上面的答案,想和你分享一些东西。

泛型类的属性有点“隐藏”,因此您无法智能感知它们以显示属性选项是什么。

有一种使用反射的方法,但你必须已经知道属性名称是什么:

using System;
using System.Reflection;
        
public class Program 
{ 
    
    public static void Main(string[] args) 
    {
        var genericType = typeof(Generic<>).MakeGenericType(typeof(Simple)); 
        var propertyInfo = genericType.GetProperty("Type");
    }
}

或者,如果您不知道 Type 是属性名称,您可以像这样运行所有属性(在本例中我们是 pri:

using System; 
using System.Linq; 
using System.Reflection; 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
        // Get the type of the generic class with Simple as the generic argument 
        var genericType = typeof(Generic<>).MakeGenericType(typeof(Simple));

        // Use reflection to get all properties of the type 
        var stringProperties = genericType.GetProperties().Where(prop => prop.PropertyType == typeof(string)).Select(prop => prop.Name).ToList(); 

        // Print the names of properties that are of type string 
        foreach (var propertyName in stringProperties) 
        { 
            Console.WriteLine($"String Property Name: {propertyName}"); 
        } 
    } 
}
© www.soinside.com 2019 - 2024. All rights reserved.