Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种方法可以;标记“;对象的属性,使其;“脱颖而出”;反思?_C#_Reflection - Fatal编程技术网

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
中的简单绑定规范可能更简单。