C# 有没有一种方法可以;标记“;对象的属性,使其;“脱颖而出”;反思?
有没有一种方法可以“标记”对象的属性,使它们在反射中“突出” 例如:C# 有没有一种方法可以;标记“;对象的属性,使其;“脱颖而出”;反思?,c#,reflection,C#,Reflection,有没有一种方法可以“标记”对象的属性,使它们在反射中“突出” 例如: class A { int aa, b; string s1, s2; public int AA { get { return aa; } set { aa = value; } } public string S1 { get { return s1; } set { s1 = value; }
class A
{
int aa, b;
string s1, s2;
public int AA
{
get { return aa; }
set { aa = value; }
}
public string S1
{
get { return s1; }
set { s1 = value; }
}
public string S2
{
get { return s2; }
set { s2 = value; }
}
}
class B : A
{
double cc, d;
C someOtherDataMember;
public C SomeOtherDataMember
{
get { return someOtherDataMember; }
}
public double CC
{
get { return cc; }
}
public double D
{
get { return d; }
set { d = value; }
}
}
class C
{...}
我希望能够仅对B
的数据成员进行操作,即标记它们,以便能够将它们与A
的成员区分开来
像这样:
B b = new B();
var x = b.GetType().GetProperties();
foreach (PropertyInfo i in x)
{
if (/*property is marked*/)
{
Console.WriteLine(i.Name);
}
}
如果它能够在没有对象实例的情况下工作就更好了,例如:
var x = B.GetType().GetProperties();
foreach (PropertyInfo i in x)
{
if (/*property is marked*/)
{
Console.WriteLine(i.Name);
}
}
有可能吗
我希望能够只对B的数据成员进行操作,即标记它们,以便能够将它们与A的成员区分开来
您可以使用自定义属性向成员添加元数据,但所需内容不需要元数据。可以使用直接反射。如果不想创建实例,请查看并使用typeof(B)
:
var x = typeof(B).GetProperties();
foreach (PropertyInfo i in x)
{
if (i.DeclaringType == typeof(B))
{
Console.WriteLine(i.Name);
}
}
您还可以在获取属性时应用该过滤器:
var x = typeof(B).GetProperties(BindingFlags.DeclaredOnly
| BindingFlags.Public
| BindingFlags.Instance);
foreach (PropertyInfo i in x)
{
Console.WriteLine(i.Name);
}
我希望能够只对B的数据成员进行操作,即标记它们,以便能够将它们与A的成员区分开来
您可以使用自定义属性向成员添加元数据,但所需内容不需要元数据。可以使用直接反射。如果不想创建实例,请查看并使用typeof(B)
:
var x = typeof(B).GetProperties();
foreach (PropertyInfo i in x)
{
if (i.DeclaringType == typeof(B))
{
Console.WriteLine(i.Name);
}
}
您还可以在获取属性时应用该过滤器:
var x = typeof(B).GetProperties(BindingFlags.DeclaredOnly
| BindingFlags.Public
| BindingFlags.Instance);
foreach (PropertyInfo i in x)
{
Console.WriteLine(i.Name);
}
您可以编写自定义属性,然后使用GetCustomAttributes方法检查属性 比如说
foreach (PropertyInfo property in properties)
{
var ca = property.GetCustomAttributes(false);
foreach (var attribute in ca)
{
if (attribute is YourAttribute)
{
//...
}
}
}
您可以编写自定义属性,然后使用GetCustomAttributes方法检查属性 比如说
foreach (PropertyInfo property in properties)
{
var ca = property.GetCustomAttributes(false);
foreach (var attribute in ca)
{
if (attribute is YourAttribute)
{
//...
}
}
}
查看自定义属性。创建一个(或多个)对你来说意味着你想要的任何标记,然后注释那些你想要标记的成员。在要查找的成员上查找属性。请参阅说明和示例。请参阅如何在属性上使用属性的示例。如果要列出由
B
声明而非继承的属性,可以使用直接反射;不需要自定义属性。查看自定义属性。创建一个(或多个)对你来说意味着你想要的任何标记,然后注释那些你想要标记的成员。在要查找的成员上查找属性。请参阅说明和示例。请参阅如何在属性上使用属性的示例。如果要列出由B
声明而非继承的属性,可以使用直接反射;不需要自定义属性。添加示例将大大提高此答案的质量。自定义属性非常适合向对象添加元数据,但是在这种情况下,GetProperties
中的简单绑定规范可能更简单。添加示例将大大提高此答案的质量。自定义属性对于向对象添加元数据非常有用,但在这种情况下,GetProperties
中的简单绑定规范可能更简单。