Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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#_.net_Reflection_Automatic Properties - Fatal编程技术网

C# 如何确定属性是否是具有反射的自动实现的属性?

C# 如何确定属性是否是具有反射的自动实现的属性?,c#,.net,reflection,automatic-properties,C#,.net,Reflection,Automatic Properties,所以在我的例子中,我使用反射来发现一个类的结构。我需要能够确定属性是否是PropertyInfo对象自动实现的属性。我假设反射API不公开此类功能,因为自动属性依赖于C,但是否有任何解决方法来获取此信息?您可以检查get或set方法是否标记有CompilerGenerated属性。然后,您可以将其与查找带有CompilerGenerated属性(包含属性名称和字符串“BackingField”)标记的私有字段相结合 也许: public static bool MightBeCouldBeMay

所以在我的例子中,我使用反射来发现一个类的结构。我需要能够确定属性是否是PropertyInfo对象自动实现的属性。我假设反射API不公开此类功能,因为自动属性依赖于C,但是否有任何解决方法来获取此信息?

您可以检查
get
set
方法是否标记有
CompilerGenerated
属性。然后,您可以将其与查找带有
CompilerGenerated
属性(包含属性名称和字符串
“BackingField”
)标记的私有字段相结合

也许:

public static bool MightBeCouldBeMaybeAutoGeneratedInstanceProperty(
    this PropertyInfo info
) {
    bool mightBe = info.GetGetMethod()
                       .GetCustomAttributes(
                           typeof(CompilerGeneratedAttribute),
                           true
                       )
                       .Any();
    if (!mightBe) {
        return false;
    }


    bool maybe = info.DeclaringType
                     .GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                     .Where(f => f.Name.Contains(info.Name))
                     .Where(f => f.Name.Contains("BackingField"))
                     .Where(
                         f => f.GetCustomAttributes(
                             typeof(CompilerGeneratedAttribute),
                             true
                         ).Any()
                     )
                     .Any();

        return maybe;
    }
它不是傻瓜式的,非常易碎,可能无法移植到(比如)Mono上。

这应该可以:

public static bool IsAutoProperty(this PropertyInfo prop)
{
    return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                             .Any(f => f.Name.Contains("<" + prop.Name + ">"));
}
由于字符
不会出现在普通字段中,因此具有此类命名的字段指向自动属性的支持字段。正如杰森所说,它仍然易碎

或者让它快一点

public static bool IsAutoProperty(this PropertyInfo prop)
{
    if (!prop.CanWrite || !prop.CanRead)
        return false;

    return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                             .Any(f => f.Name.Contains("<" + prop.Name + ">"));
}
public static bool IsAutoProperty(此属性info prop)
{
如果(!prop.CanWrite | |!prop.CanRead)
返回false;
返回prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f=>f.Name.Contains(“”);
}

非常感谢Jason,反射器同时也告诉我:)应该早一点想到。@3o4eTo:这不是傻瓜式的,易碎的,可能无法移植到Mono上。如果属性上没有getter,也要注意例外情况。是的。为什么我们需要检查属性?除了其他限制,这只适用于C#生成的自动道具。VB.NET编译器使用的模式只是将前缀
\uu
放在自动属性名称上,但确实包含
CompilerGeneratedAttribute
属性。F#编译器不使用apply属性,而是使用另一种命名约定。
public static bool IsAutoProperty(this PropertyInfo prop)
{
    if (!prop.CanWrite || !prop.CanRead)
        return false;

    return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                             .Any(f => f.Name.Contains("<" + prop.Name + ">"));
}