c#来自类的对象的gettype

时间:2009-12-07 20:53:37

标签: c# reflection class

我怎样才能做到这一点?:

public class myClass
{
 public string first;
 public int second;
 public string third;
}

public string tester(object param)
{
 //Catch the name of what was passed not the value and return it
}

//So:
myClass mC = new myClass();

mC.first = "ok";
mC.second = 12;
mC.third = "ko";

//then would return its type from definition :
tester(mC.first) // would return : "mc.first" or "myClass.first" or "first"
//and 
tester(mC.second) // would return : "mc.second" or "myClass.second" or "second"

3 个答案:

答案 0 :(得分:9)

如果没有infoof,您可以通过表达式树Tester(() => mC.first)做到最好......

using System;
using System.Linq.Expressions;
public static class Test
{
    static void Main()
    {
        //So:
        myClass mC = new myClass();

        mC.first = "ok";
        mC.second = 12;
        mC.third = "ko";
        //then would return its type from definition :
        Tester(() => mC.first); // writes "mC.first = ok"
        //and 
        Tester(() => mC.second); // writes "mC.second = 12"
    }
    static string GetName(Expression expr)
    {
        if (expr.NodeType == ExpressionType.MemberAccess)
        {
            var me = (MemberExpression)expr;
            string name = me.Member.Name, subExpr = GetName(me.Expression);
            return string.IsNullOrEmpty(subExpr)
                ? name : (subExpr + "." + name);
        }
        return "";
    }
    public static void Tester<TValue>(
        Expression<Func<TValue>> selector)
    {
        TValue value = selector.Compile()();

        string name = GetName(selector.Body);

        Console.WriteLine(name + " = " + value);
    }
}

答案 1 :(得分:0)

这是不可能的。编译代码中不存在变量名,因此无法在运行时检索变量名

答案 2 :(得分:0)

那是不可能的。 “param”将没有关于价值来源的信息。

当调用tester()时,会在其中一个属性中创建一个值的副本,因此该属性的“链接”将丢失。