C#反思:找到的属性,在一成员领域
-
03-07-2019 - |
题
我可以问这个是错误地输入,但可以如何你能找到的领域在一个类自身内部的...例如...
public class HtmlPart {
public void Render() {
//this.GetType().GetCustomAttributes(typeof(OptionalAttribute), false);
}
}
public class HtmlForm {
private HtmlPart _FirstPart = new HtmlPart();
[Optional] //<-- how do I find that?
private HtmlPart _SecondPart = new HtmlPart();
}
或者,也许我只是在做这个错误...怎么我可以叫一个方法,然后检查属性应用于本身?
此外,为了问题 -我只是好奇如果这是有可能找到的属性信息 不知道/访问的父类!
解决方案
如果我理解你的问题,我认为你想做的事情是不可能的......
在 Render
方法中,您希望获得应用于该对象的可能属性。该属性属于 _SecondPart
字段,属于类 HtmlForm
。
要使其工作,您必须将调用对象传递给 Render
方法:
public class HtmlPart {
public void Render(object obj) {
FieldInfo[] infos = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
foreach (var fi in infos)
{
if (fi.GetValue(obj) == this && fi.IsDefined(typeof(OptionalAttribute), true))
Console.WriteLine("Optional is Defined");
}
}
}
其他提示
以下是给定单个对象如何查找该对象上的任何公共或私有字段是否具有特定属性的示例:
var type = typeof(MyObject);
foreach (var field in type.GetFields(BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance))
{
if (field.IsDefined(typeof(ObsoleteAttribute), true))
{
Console.WriteLine(field.Name);
}
}
对于问题的第二部分,您可以使用以下方法检查当前方法中的属性是否为defiend:
MethodInfo.GetCurrentMethod().IsDefined(typeof(ObsoleteAttribute));
修改强>
要回答您的编辑,可以在不知道实际类型的情况下进行。以下函数采用类型Parameter并返回具有给定属性的所有字段。某个地方的某个人要么知道你要搜索的类型,要么会有你要搜索的类型的实例。
如果不这样做,你就必须像Jon Skeet所说的那样枚举一个程序集中的所有对象。
public List<FieldInfo> FindFields(Type type, Type attribute)
{
var fields = new List<FieldInfo>();
foreach (var field in type.GetFields(BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Instance))
{
if (field.IsDefined(attribute, true))
{
fields.Add(field);
}
}
return fields;
}
你可以找到的领域内的一类使用 Type.GetFields
, 和你可以找到的属性应用于一个领域的使用 MemberInfo.GetCustomAttributes
或 IsDefined
-但如果你需要找到所有领域的一个特定的类型,你要有:
- 迭代所有集会你想搜索
- 迭代所有种类内的每个组件
- 迭代所有领域内的各种类型
- 检查属性的存在/缺乏的每个领域
现在,如果你真的想找出"是一个特殊属性应用于的领域,其价值是一个参考"这个"对象",那么就更难-因为你必须知道的所有关于每一目的的系统。你也应该铭记,有可能是 两个 领域都有相同的值,即引用相同的对象。将该数目为"可选"在这种情况下或没有?
基本上,如果该物体应当拥有一个属性(例如任择或不)然后,必须有财产的对象本身,而不是该领域含有的财产。
这可能是我误解了什么你想要做,但我 嫌疑人 它要么不可行的,或者至少不是一个好主意。你能解释一下更大的图片在这里?什么是你真的在努力实现与这种属性?