我需要使用反射来检查C#位置记录中不可写入的属性。
这是一个样例位置记录:
record MyRecord(int MyProperty);
MyProperty
符合预期,是不可写的:
MyRecord myRecord = new(5);
Console.WriteLine(myRecord.MyProperty); // 5
//myRecord.MyProperty = 6; <-- yields compile time error as expected
然而,经过思考我发现:
PropertyInfo pi = typeof(MyRecord).GetProperty("MyProperty");
Console.WriteLine(pi.CanWrite); // True
MethodInfo mi = pi.GetSetMethod();
Console.WriteLine(mi == null); // False
Console.WriteLine(mi.IsPublic); // True
看起来MyProperty
是可以公开进行写入的。问题似乎在于初始化访问器,因为
record MyRecord
{
public int MyProperty { get; } = 5;
}
MyProperty
的CanWrite
设置为false
,但这种记录定义不是我需要的。
那么有没有一种方法可以使用反射来区分记录中的初始化访问器和设置访问器?
modreq
应用于设置方法,而不是属性本身,我找不到访问方法的属性的方法... - Jon SkeetIsExternalInit
的文档页面上说“此类不应由开发人员在源代码中使用”,但这是开发人员检测 init 属性的唯一方法... - SweeperIsExternalInit
可用作类型在技术上并不是必要的。 - Jeroen Mostert