在C#中获取对字段值的引用[重复]

Posted

技术标签:

【中文标题】在C#中获取对字段值的引用[重复]【英文标题】:Get ref to field value in C# [duplicate] 【发布时间】:2020-06-07 03:18:13 【问题描述】:

我需要在 C# 中获取对字段值的引用,但我找不到任何方法来获取对可以作为参数传递的字段的实际引用。任何帮助将不胜感激。

例子:

public class SomeClass 

    public int value = 0;


public class SomeOtherClass

    static void Main(string[] args)
    
        SomeClass x = new SomeClass();
        Console.WriteLine(x.value);       //Outputs "0"

        foreach (FieldInfo field in x.GetType().GetFields())
        
            Log(ref field.value)          //Outputs "10"
                  //       ^
                  //Not a valid member

    static void Log(ref int i)
    
        i = 10;
        Console.WriteLine(i);
    


【问题讨论】:

我用过 field.GetValue(null).ToString() 为什么你还需要参考值?您基本上只是将其作为 Log 方法的常量处理。 你在前一天已经问过这个问题了。 Get Reference to Field from Reflection 请不要因为您没有收到旧问题的答案而提出新问题。我认为您需要更好地阐明您的要求——如果可以的话,我实际上可能会为您提供解决方案 @rmed1na 这是我试图实现的类比。我需要能够获得对该字段的活动引用并使用反射将其作为 ref 参数传递。 @BeckamWhite 为什么不将对象作为引用本身传递呢?我的意思是,我仍然看不到任何用途或为什么将其作为参考传递。引用参数的用法是实际更改作为参数传递的对象的内容。如果您需要更改它,请将整个对象作为 ref 传递并在内部更改工作方法。 【参考方案1】:

试试下面的

public class SomeClass

    public int value = 0;


public class SomeOtherClass

    public static void Main(string[] args)
    
        SomeClass x = new SomeClass();
        Console.WriteLine(x.value); // Output Line 1
        foreach (FieldInfo field in x.GetType().GetFields())
        
            Console.WriteLine(field.GetValue(x)); // Output Line 2
            var y = (int)field.GetValue(x);
            Log(ref y);
            Console.WriteLine(y); // Output Line 4
        
    

    static void Log(ref int i)
    
        i = 10;
        Console.WriteLine(i); // Output Line 3
    


输出: 0 0 10 10

【讨论】:

这可行,但我需要Log() 方法来更改SomeClass 中的值【参考方案2】:
  class Program
    

        public class SomeClass
        
            public int value = 0;
        

        public class SomeOtherClass
        
            static void Main(string[] args)
            
                var x = new SomeClass();
                Console.WriteLine(x.value);       //Outputs "0"
                foreach (FieldInfo field in x.GetType().GetFields())
                
                    var value = (int)field.GetValue(x);
                    Log(ref x);
                    Console.WriteLine(x.value);
                
            

            static void Log(ref SomeClass x)
            
                x.value = 10;
            

        

    

【讨论】:

这可行,但我需要Log() 方法来更改对象x 而不是y 中的值 我已经更新了答案。我希望它会是你想要的。

以上是关于在C#中获取对字段值的引用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C# Linq 对重复值的完全外连接

在C#中获取命名空间中的类列表[重复]

如何从c#中的数组中获取所有非空值[重复]

如何获取对数组中对象的引用[重复]

[Elasticsearch] 关于字段重复值的常用查询和操作总结

MongoDB:如何为集合中的每个文档设置一个等于另一个字段值的新字段[重复]