假设我们有些类没有公共接口或基类。我们如何获得想要的班级名称?可能吗?我发现以下代码按预期工作。但是,我想通过传递类名在函数中使用它。还有其他方法可以实现吗?
MemberInfo[] members = typeof(objectWhatever).GetMembers();
foreach (MemberInfo memberInfo in members.Where(p => p.MemberType == MemberTypes.Property))
{
Console.WriteLine("Name: {0}", memberInfo.Name); // Name: MyField
}
我尝试编写以下内容,但在语法上不起作用。
public static List<string> FieldNames(object obj ,string className)
{
dynamic changedObj = Convert.ChangeType(obj, Type.GetType(className));
MemberInfo[] members = typeof(changedObj).GetMembers();
foreach (MemberInfo memberInfo in members.Where(p => p.MemberType == MemberTypes.Property))
{
Console.WriteLine("Name: {0}", memberInfo.Name); // Name: MyField
}
}
首先,我们必须找到Type
给定名称,例如
// className either in short format: "Form" or
// in full format: "System.Windows.Forms.Form"
private static Type TypeFromName(string className)
{
if (string.IsNullOrWhiteSpace(className))
return null;
return AppDomain
.CurrentDomain
.GetAssemblies()
.SelectMany(asm => asm.GetTypes())
.FirstOrDefault(t => t.Name == className || t.Namespace + "." + t.Name == className);
}
然后我们准备枚举属性:唯一的区别是我们使用tp
- Type
找到而不是硬编码 typeof(objectWhatever)
string className = ...
Type tp = TypeFromName(className);
if (tp != null)
{
var members = tp
.GetMembers()
.Where(p => p.MemberType == MemberTypes.Property);
foreach (MemberInfo memberInfo in members)
{
Console.WriteLine("Name: {0}", memberInfo.Name);
}
}
else
{
// className has not been found
}
我想在您的年龄下获得您的经验,但我知道这是不可能的。它像一种魅力。谢谢。
@snr:我建议使用Reflection和Linq:在得到Reflection的帮助下
Property/FieldInfo
,然后由Linq查询。非常感谢先生。
主席先生,您介意以下问题吗?stackoverflow.com/questions/59550456/…