获取变量(不难

我正在寻找一种方法来检索变量名称,所以我不需要在需要时使用硬编码声明(对于属性名称等):

我几乎不相信这是可能的。 也许有人有解决方案。 注意:即使不是变量,属性也是一个举动。

'Pseudo:
Module Module1

    Sub Main()
        Dim variable = "asdf"
        Dim contact As New Contact

        Dim v1 = GetVariableName(variable) 'returns variable
        Dim v2 = GetVariableName(contact.Name) 'returns Name

    End Sub

    Class Contact
        Public ReadOnly Property Name()
            Get
                Return Nothing
            End Get
        End Property
    End Class

    Public Function GetVariableName(variable As Object) As String
        ':}
    End Function

End Module

答案是在VB或C#中。


呵呵有个简单的解决方法,这里使用表达式树就是一个例子,只是适应你在c#中的需求

string GetPropertyName<T>(Expression<Func<T>> property)
{
    MemberExpression ex = (MemberExpression)property.Body;
    string propertyName = ex.Member.Name;
    return propertyName;
}

现在你可以做

String example = null;
String propertyName = GetPropertyName(()=>example.Length);
//propertyName == "Length"

我第一次看到这是一个启示! ;)


@Abraham Pinzur; 在您链接到的文章中的进一步链接提供此片段后:

static void Main(string[] args)
{
Console.WriteLine("Name is '{0}'", GetName(new {args}));
Console.ReadLine();
}

static string GetName<T>(T item) where T : class
{
var properties = typeof(T).GetProperties();
return properties[0].Name;
}

哪个产生“名称是'参数'”。 Rinat的方法利用C#编译器生成的属性名称在表达式new{args}生成一个匿名类型。 完整的文章在这里:http://abdullin.com/journal/2008/12/13/how-to-find-out-variable-or-parameter-name-in-c.html

- 编辑 -

进一步阅读Rinat的文章后,也可以通过生成表达式树并浏览树或其包含的IL来完成。 基本上,阅读链接的文章!


Rinat Abdullin通过从匿名方法(或lambda表达式)中解析IL来做类似的事情。 他的完整代码在这里。

所以,你的例子看起来像这样:

class Program
{
    static void Main (string[] args)
    {
        var variable = "asdf";

        var v1 = GetVariableName(() => variable);  // returns "variable"
    }

    static string GetVariableName (Func<object> variable)
    {   // Again, credit to Mr. Abdullin ...
        var il = variable.Method.GetMethodBody().GetILAsByteArray();
        var fieldHandle = BitConverter.ToInt32(il,2);
        var field = variable.Target.GetType()
                .Module.ResolveField(fieldHandle);
        return field.Name;
    }
}

但是,这不会直接扩展到第二种情况( contact.Name - > "Name" )。

链接地址: http://www.djcxy.com/p/52827.html

上一篇: Get variable (not hard

下一篇: How to know in C# code which type a variable was declared with