如何使用C#反射将源值影响为常量
我的问题是: 我有一个a类(来自项目a)引用B类(来自项目B)。每个项目都是为自己的组件而构建的如何使用C#反射将源值影响为常量,c#,C#,我的问题是: 我有一个a类(来自项目a)引用B类(来自项目B)。每个项目都是为自己的组件而构建的 public class B { public const string CONSTANT_B= "Anything"; } public class A { public const string filedA = B.CONSTANT_B; } 我需要从一个类中获取fieldA,并验证它的值是否来自另一个类(这里是class B) 我这样做: var fieldInfo
public class B
{
public const string CONSTANT_B= "Anything";
}
public class A
{
public const string filedA = B.CONSTANT_B;
}
我需要从一个类中获取fieldA,并验证它的值是否来自另一个类(这里是class B)
我这样做:
var fieldInfo = typeof(A).GetFields(BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public)[0];
var value = fieldInfo.GetValue(BindingFlags.Default);
结果是:“什么都可以”
那么我怎样才能得到B常数呢?或者只是想知道A类是否需要参考B类
我的目标是删除对项目B的引用(如果项目A未使用)。
那么,我如何决定删除它或保留它呢?
仅供参考:我有这些项目的源代码和二进制文件
我怎样才能得到B.常数
在构建项目A时,不能将字段的值从clas B的常量字段中读取,并直接烘焙到代码中。没有要查询的元数据或要反汇编的IL会告诉您该值来自B.CONSTANT\u B
验证类A是否从类B获得常量的唯一方法是查看源代码
还请注意,如果更改B.CONSTANT_B
的值,则该更改不会反映在A类中,除非重新生成项目
现在,如果两个字段都是
readonly
而不是constant
,则可以反汇编IL以查看project A是否引用B中的只读字段,但它仍然无法通过反射获得。此信息在运行时可能不可用,特别是当这两个类都位于同一程序集中时。编译器可能应用的优化之一是将常量B
的值复制到A
中。这是否是交叉装配,我不确定。即使不是,引用B
的唯一位置将出现在A
的静态初始值设定项中。获取此信息需要反汇编其IL代码。是的,编译器将使用常量中的值,甚至跨程序集。如果它真的是“常数”,那么它可以使用这个值,因为它永远不会改变。如果它可能会随着时间而改变,那么常量
是不合适的。非常好的答案,因为它包含了一个证明答案的简单方法谢谢@D Stanley的回答。您是否知道如何验证类A需要使用源代码引用类B(我希望以编程方式执行此操作)