Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#反射将源值影响为常量_C# - Fatal编程技术网

如何使用C#反射将源值影响为常量

如何使用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

我的问题是:

我有一个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 = 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(我希望以编程方式执行此操作)