没有。
语言标准不限制自动生成的支持字段的自动属性名称。
这是我获取自动属性支持字段的 FieldInfo 的方法:
public static FieldInfo? GetAutoPropertyBackingField(this PropertyInfo pi, bool strictCheckIsAutoProperty = false)
{
if (strictCheckIsAutoProperty && !StrictCheckIsAutoProperty(pi)) return null;
var gts = pi.DeclaringType?.GetGenericArguments();
var accessor = pi.GetGetMethod(true);
var msilBytes = accessor?.GetMethodBody()?.GetILAsByteArray();
var rtk = null != msilBytes
? accessor!.IsStatic
? GetAutoPropertyBakingFieldMetadataTokenInGetMethodOfStatic(msilBytes)
: GetAutoPropertyBakingFieldMetadataTokenInGetMethodOfInstance(msilBytes)
: -1;
accessor = pi.GetSetMethod(true);
msilBytes = accessor?.GetMethodBody()?.GetILAsByteArray();
if (null != msilBytes)
{
var wtk = accessor!.IsStatic
? GetAutoPropertyBakingFieldMetadataTokenInSetMethodOfStatic (msilBytes)
: GetAutoPropertyBakingFieldMetadataTokenInSetMethodOfInstance(msilBytes);
if (-1 != wtk)
{
if (wtk == rtk)
{
var wfi = pi.Module.ResolveField(wtk, gts, null);
if (!strictCheckIsAutoProperty || null == wfi || StrictCheckIsAutoPropertyBackingField(pi, wfi)) return wfi;
}
return null;
}
}
if (-1 == rtk) return null;
var rfi = pi.Module.ResolveField(rtk, gts, null);
return !strictCheckIsAutoProperty || null == rfi || StrictCheckIsAutoPropertyBackingField(pi, rfi) ? rfi : null;
}
private static bool StrictCheckIsAutoProperty (PropertyInfo pi) => null != pi.GetCustomAttribute<CompilerGeneratedAttribute>();
private static bool StrictCheckIsAutoPropertyBackingField(PropertyInfo pi, FieldInfo fi) => fi.Name == "<" + pi.Name + ">k__BackingField";
private static int GetAutoPropertyBakingFieldMetadataTokenInGetMethodOfStatic (byte[] msilBytes) => 6 == msilBytes.Length && 0x7E == msilBytes[0] && 0x2A == msilBytes[5] ? BitConverter.ToInt32(msilBytes, 1) : -1;
private static int GetAutoPropertyBakingFieldMetadataTokenInSetMethodOfStatic (byte[] msilBytes) => 7 == msilBytes.Length && 0x02 == msilBytes[0] && 0x80 == msilBytes[1] && 0x2A == msilBytes[6] ? BitConverter.ToInt32(msilBytes, 2) : -1;
private static int GetAutoPropertyBakingFieldMetadataTokenInGetMethodOfInstance(byte[] msilBytes) => 7 == msilBytes.Length && 0x02 == msilBytes[0] && 0x7B == msilBytes[1] && 0x2A == msilBytes[6] ? BitConverter.ToInt32(msilBytes, 2) : -1;
private static int GetAutoPropertyBakingFieldMetadataTokenInSetMethodOfInstance(byte[] msilBytes) => 8 == msilBytes.Length && 0x02 == msilBytes[0] && 0x03 == msilBytes[1] && 0x7D == msilBytes[2] && 0x2A == msilBytes[7] ? BitConverter.ToInt32(msilBytes, 3) : -1;
最后 6 个单行方法的代码看起来可能有点乱,因为浏览器使用的是非固定宽度的字体。
2 种严格检查方法适用于 M$ dotnetfx 运行时。
关键代码使用编译器生成的 MSIL 字节在最后 4 个方法中查找 auto 属性的支持字段。它们适用于 M$ 的 dotnetfx4x 和 dotnet5,可能还适用于所有 M$ 的 dotnetfx 运行时。
如果您将它与 mono 或其他框架一起使用,您可以使用 dnSpy 或其他类似工具查看编译器发出的自动属性的属性、支持字段的名称和 setter/getter 的 IL 字节,然后修改 6 个单行方法以适应它们。当然,您可以添加一些其他严格的检查,以确保代码在您的程序正在运行的 fx 上正常工作。