访问静态代码块中的“this”
本文关键字:this 静态 代码 访问 | 更新日期: 2023-09-27 18:35:04
最近我发现自己写了很多类似于以下内容的类:
public class MyTypeCodes
{
public static MyTypeCode E = new MyTypeCode{ Desc= "EEE", Value = "E" };
public static MyTypeCode I = new MyTypeCode { Desc= "III", Value = "I" };
private static readonly Lazy<IEnumerable<MyTypeCode>> AllMyTypeCodes =
new Lazy<IEnumerable<MyTypeCode>>(() =>
{
var typeCodes = typeof(MyTypeCodes)
.GetFields(BindingFlags.Static | BindingFlags.Public)
.Where(x => x.FieldType == typeof (MyTypeCode))
.Select(x => (MyTypeCode) x.GetValue(null))
.ToList();
return typeCodes;
});
public static IEnumerable<MyTypeCode> All
{
get { return AllMyTypeCodes.Value; }
}
}
如果你注意到new Lazy<IEnumerable<MyTypeCode>>(() =>
里面我特别需要做typeof(MyTypeCodes)
即使我在类 MyTypeCode 里。有什么方法可以编写它而无需特别为我专门所在的类调用typeof()
?如果这是一种常规方法,我会this.GetType()
显然(出于某种原因)不适用于静态。
有什么方法可以编写它而无需特别需要为我专门在其中的类调用 typeof()?
不,这可能是最好的选择。 如果您知道您永远不会添加任何其他类型的字段,则可以跳过Where
子句。
此外,还应使用 ToList()
来防止生成的IEnumerable<T>
在每次枚举时都必须重新运行:
private static readonly Lazy<IEnumerable<MyTypeCode>> AllMyTypeCodes =
new Lazy<IEnumerable<MyTypeCode>>(() =>
{
return typeof(MyTypeCodes)
.GetFields(BindingFlags.Static | BindingFlags.Public)
// If you're not using any other fields, just skip this
// .Where(x => x.FieldType == typeof (MyTypeCode ))
.Select(x => (MyTypeCode) x.GetValue(null))
.ToList();
});
创建一个私有构造函数,为您提供(私有)引用。
private MyTypeCodes() { }
private static MyTypeCodes _instance = new MyTypeCodes();
public static DoSomethingWithType()
{
return _instance.GetType().foo();
}
或者你可以让构造函数调用 GetType() 并使用它而不是调用 _instance。GetType() 每次你需要它的时候。
如果你更喜欢语义,你可以做:
private static readonly Type _thisType = typeof(MyTypeCodes);
// use like
var typeCodes = _thisType.GetFields(...