- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的代码可以看到非公共(public)成员,但看不到公共(public)成员。为什么?
FieldInfo[] publicFieldInfos =
t.GetFields(BindingFlags.Instance | BindingFlags.Public);
什么都不返回。
注意:我正在尝试获取抽象类的属性以及具体类。 (并阅读属性)。
MSDN 示例使用 2 个标志 (BindingFlags.Instance | BindingFlags.Public)
但我下面的迷你继承示例没有。
private void RunTest1()
{
try
{
textBox1.Text = string.Empty;
Type t = typeof(MyInheritedClass);
//Look at the BindingFlags *** NonPublic ***
int fieldCount = 0;
while (null != t)
{
fieldCount += t.GetFields(BindingFlags.Instance |
BindingFlags.NonPublic).Length;
FieldInfo[] nonPublicFieldInfos = t.GetFields(BindingFlags.Instance |
BindingFlags.NonPublic);
foreach (FieldInfo field in nonPublicFieldInfos)
{
if (null != field)
{
Console.WriteLine(field.Name);
}
}
t = t.BaseType;
}
Console.WriteLine("\n\r------------------\n\r");
//Look at the BindingFlags *** Public ***
t = typeof(MyInheritedClass);
FieldInfo[] publicFieldInfos = t.GetFields(BindingFlags.Instance |
BindingFlags.Public);
foreach (FieldInfo field in publicFieldInfos)
{
if (null != field)
{
Console.WriteLine(field.Name);
object[] attributes = field.GetCustomAttributes(t, true);
if (attributes != null && attributes.Length > 0)
{
foreach (Attribute att in attributes)
{
Console.WriteLine(att.GetType().Name);
}
}
}
}
}
catch (Exception ex)
{
ReportException(ex);
}
}
private void ReportException(Exception ex)
{
Exception innerException = ex;
while (innerException != null)
{
Console.WriteLine(innerException.Message + System.Environment.NewLine +
innerException.StackTrace + System.Environment.NewLine +
System.Environment.NewLine);
innerException = innerException.InnerException;
}
}
public abstract class MySuperType
{
public MySuperType(string st)
{
this.STString = st;
}
public string STString
{
get;
set;
}
public abstract string MyAbstractString { get; set; }
}
public class MyInheritedClass : MySuperType
{
public MyInheritedClass(string ic)
: base(ic)
{
this.ICString = ic;
}
[Description("This is an important property"), Category("HowImportant")]
public string ICString
{
get;
set;
}
private string _oldSchoolPropertyString = string.Empty;
public string OldSchoolPropertyString
{
get { return _oldSchoolPropertyString; }
set { _oldSchoolPropertyString = value; }
}
[Description("This is a not so importarnt property"),
Category("HowImportant")]
public override string MyAbstractString
{
get;
set;
}
}
编辑
这是我采纳此处给出的建议后的代码:
private void RunTest1()
{
try
{
textBox1.Text = string.Empty;
Type t = typeof(MyInheritedClass);
//Look at the BindingFlags *** NonPublic ***
int fieldCount = 0;
while (null != t)
{
fieldCount += t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic).Length;
PropertyInfo[] nonPublicFieldInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic);
foreach (PropertyInfo field in nonPublicFieldInfos)
{
if (null != field)
{
Console.WriteLine(field.Name);
}
}
t = t.BaseType;
}
Console.WriteLine("\n\r------------------\n\r");
//Look at the BindingFlags *** Public ***
t = typeof(MyInheritedClass);
PropertyInfo[] publicFieldInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (PropertyInfo field in publicFieldInfos)
{
if (null != field)
{
Console.WriteLine(field.Name);
textBox1.Text += field.Name + System.Environment.NewLine;
DescriptionAttribute[] attributes = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes != null && attributes.Length > 0)
{
foreach (Attribute att in attributes)
{
Console.WriteLine(att.GetType().Name);
}
}
}
}
}
catch (Exception ex)
{
ReportException(ex);
}
}
private void ReportException(Exception ex)
{
Exception innerException = ex;
while (innerException != null)
{
Console.WriteLine(innerException.Message + System.Environment.NewLine + innerException.StackTrace + System.Environment.NewLine + System.Environment.NewLine);
}
}
public abstract class MySuperType
{
public MySuperType(string st)
{
this.STString = st;
}
public string STString
{
get;
set;
}
public abstract string MyAbstractString {get;set;}
}
public class MyInheritedClass : MySuperType
{
public MyInheritedClass(string ic)
: base(ic)
{
this.ICString = ic;
}
[Description("This is an important property"),Category("HowImportant")]
public string ICString
{
get;
set;
}
private string _oldSchoolPropertyString = string.Empty;
public string OldSchoolPropertyString
{
get { return _oldSchoolPropertyString; }
set { _oldSchoolPropertyString = value; }
}
[Description("This is a not so importarnt property"), Category("HowImportant")]
public override string MyAbstractString
{
get; set;
}
}
最佳答案
可能是因为您正在使用 GetFields
并且该类没有任何公共(public)字段:属性和字段是两个不同的东西。
尝试使用 GetProperties
方法而不是 GetFields
.
关于c# - 为什么我的 Type.GetFields(BindingFlags.Instance|BindingFlags.Public) 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3024218/
对于我的应用程序,我需要能够找到类型(不是实例)的字段列表以及运行时这些字段的类型。到目前为止,我只能获得一个包含classOf[MyCaseClass].getMethods的getter的case
我正在尝试在个人资料页面上显示用户行中的点。我尝试使用以下内容 getField('points');?> 拉出包含用户点的字段,但没有为我正在测试的用户显示任何内容。我正在测试它,以设置了 16 点
问题:我希望用户输入一种颜色(红色、蓝色)并将其转换为与颜色一起使用 我一直在看这个 Getting a Color from a String input ,我知道最好使用 JColorChoose
谁能看出我在下面做错了什么?该类型具有服务方法试图访问的公共(public)属性,那么为什么它没有被反射拾取? Public class SomeClass { private YetAnoth
我正在尝试 getField 但总是返回 null这是代码的图像和变量的监视。 代码:FieldInfo xSortField = xFieldInfo.GetValue(x).GetType().G
我试图反射(reflect)派生类型中的字段,但它返回的字段基本类型。 public class basetype { string basevar; } public class deriv
我目前正在尝试将 Xamarin.iOS 应用程序库转换为 PCL。我有这段无法编译的代码: private void SetPrivateField(object item, string
我希望能够为用户定义的类型创建一个调度,该类型本质上将进行就地复制。但是,我想以一种类型稳定的方式来做,因此我想避免使用 getfield直接,而是尝试使用生成的函数。像这样的类型是否可能 type
我注意到在调用 GetFields() 时在枚举类型上,我得到了一个 int32 类型的额外字段。它从哪里来的?? 当我调用另一个重载 (GetFields(System.Reflection.Bin
我试图了解 Mirrors Api 的工作原理。具体来说,如何从它的Symbol中获取一个字段的值, 使用 getField . 对于getField方法,它应该适用于任何 Symbol这是一个 se
我有一个示例类: public class A { public int x; } 如果我要做如下的事情: Class a = Class.forName("A"); for (Field f
如果我通过 Assembly.Load 加载程序集,我可以迭代其类型,通过 typef(...).IsAssignableFrom 查找特定类型,并通过 GetField 从类型中获取字段信息。 当我
public string[] tName = new string[]{"Whatever","Doesntmatter"}; string vBob = "Something"; string[]
我已将 720 张新图像添加到我的 Drawable 文件夹中,但是当我使用 Field[] drawables = android.R.drawable.class.getFields() 时,没有
在我目前正在处理的项目中,我偶然发现了这个问题: 我想创建类“ApiID”的实例。我从 Reflector 获得了代码,如您所见,.dll(不是我的项目)导入来自非托管代码,我无权访问。 [S
Class.getFields() 的 Javadoc 说:“返回的数组中的元素未排序且未按任何特定顺序排列。” 关于订单实际如何确定的任何提示?有没有可能当我两次执行这个方法时,我得到的字段顺序不同
这段旧代码在使用反射的方法调用中返回一个用属性修饰的字段列表 有没有办法用 TypeDescripter 或 LINQ 替换它? public static FieldInfo[] GetFi
我正在尝试检索对象的公共(public)属性,但它没有返回任何内容。你能告诉我我做错了什么吗? public class AdHocCallReportViewModel : ReportViewMo
我正在尝试实现一个位于 https://github.com/jbogard/presentations/blob/master/WickedDomainModels/After/Model/Enum
C#,网络 2.0 这是代码(我取出了所有特定于域的内容,它仍然返回一个空数组): using System; using System.Collections.Generic; using Syst
我是一名优秀的程序员,十分优秀!