C#访问泛型类中类型T的静态属性我正在尝试完成以下场景,其中泛型TestClassWrapper将能够访问类的静态它构成属性(它们都将派生自TestClass)。类似于:publicclassTestClass{publicstaticintx=5;}publicclassTestClassWrapperwhereT:TestClass{publicinttest(){returnTx;}}给出错误:“T”是“类型参数”,在给定上下文中无效。有什么建议么?基本上,你不能没有反思。一种选择是将委托放在构造函数中,这样创建实例的人就可以指定如何获取它:varwrapper=newTestClassWrapper(()=>TestClass.x);如有必要,您可以通过反射来做到这一点:publicinttest(){return(int)field.GetValue(null);}}(如有必要,添加适当的绑定标志。)它不是很好,但至少你只需要查找一次......当然你可以写:publicinttest(){returnTestClass.x;即使在一个不平凡的例子中,你也不能覆盖静态字段,所以它总是从一个已知的基类中调用。为什么它不返回TestClass.x?在这种情况下,您假设T是TestClass的子类。TestClass的子类没有staticintx。泛型不支持与静态成员相关的任何内容,因此这是行不通的。我的建议:不要让它停滞不前。假设该字段确实与特定的T相关,也可以使用反射:return(int)typeof(T).GetField("x").GetValue(null);但我不推荐它。T是一种类型,而不是参数或变量,因此您不能从任何成员中选择任何值。这是一个示例代码。publicclassUrlRecordService{publicvirtualvoidSaveSlug(Tentity)whereT:ISlugSupport{if(entity==null)thrownewArgumentNullException("entity");intentityId=entity.Id;stringentityName=typeof(T).Name;}}publicinterfaceISlugSupport{intId{get;放;另一种解决方案是简单地不使其成为静态的并在T上使用new()约束来实例化对象。然后您可以使用该接口,包装器可以从任何实现该接口的类中获取属性:publicinterfaceXExposer{Int32X{get;}}publicclassTestClass:XExposer{publicInt32X{get{return5;}}}publicclassXExposerWrapperwhereT:XExposer,new(){publicInt32X{get{returnnewT().X;您实际上可以在TestClassWrapper上将其更改为publicstaticInt32X,并将其作为Int32fetchedX=XExposerWrapper.X;虽然无论代码调用什么都必须对参数T给予同样的约束,但是这个时候包装类是非常没有必要的,因为调用代码本身也可以只执行newT().X而没有必要使用包装纸。但是,在一些有趣的继承模型中,这种结构很有用。例如,抽象类SuperClass,其中T:SuperClass,new()可以在其静态函数中实例化并返回类型T,有效地允许您创建适应子类的可继承静态函数(然后需要将其定义为类ChildClass:超类)。通过在超类上定义受保护的抽象函数/属性,您可以创建对任何继承对象应用相同逻辑的函数,但根据这些抽象的实现对子类进行自定义。我将它用于数据库类,其中表名和获取查询由子类实现。由于属性受到保护,因此它们也不会暴露。以上就是C#学习教程:C#访问泛型类中类型T的静态属性全部内容分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
