Finding the variable name passed to a function

前端 未结 17 1957
广开言路
广开言路 2020-11-22 04:11

Let me use the following example to explain my question:

public string ExampleFunction(string Variable) {
    return something;
}

string WhatIsMyName = "         


        
相关标签:
17条回答
  • 2020-11-22 04:40

    What you want isn't possible directly but you can use Expressions in C# 3.0:

    public void ExampleFunction(Expression<Func<string, string>> f) {
        Console.WriteLine((f.Body as MemberExpression).Member.Name);
    }
    
    ExampleFunction(x => WhatIsMyName);
    

    Note that this relies on unspecified behaviour and while it does work in Microsoft’s current C# and VB compilers, and in Mono’s C# compiler, there’s no guarantee that this won’t stop working in future versions.

    0 讨论(0)
  • 2020-11-22 04:42

    No, but whenever you find yourself doing extremely complex things like this, you might want to re-think your solution. Remember that code should be easier to read than it was to write.

    0 讨论(0)
  • 2020-11-22 04:43

    Thanks for all the responses. I guess I'll just have to go with what I'm doing now.

    For those who wanted to know why I asked the above question. I have the following function:

    string sMessages(ArrayList aMessages, String sType) {
        string sReturn = String.Empty;
        if (aMessages.Count > 0) {
            sReturn += "<p class=\"" + sType + "\">";
            for (int i = 0; i < aMessages.Count; i++) {
                sReturn += aMessages[i] + "<br />";
            }
            sReturn += "</p>";
        }
        return sReturn;
    }
    

    I send it an array of error messages and a css class which is then returned as a string for a webpage.

    Every time I call this function, I have to define sType. Something like:

    output += sMessages(aErrors, "errors");
    

    As you can see, my variables is called aErrors and my css class is called errors. I was hoping my cold could figure out what class to use based on the variable name I sent it.

    Again, thanks for all the responses.

    0 讨论(0)
  • 2020-11-22 04:44

    Do this

    var myVariable = 123;
    myVariable.Named(() => myVariable);
    var name = myVariable.Name();
    // use name how you like
    

    or naming in code by hand

    var myVariable = 123.Named("my variable");
    var name = myVariable.Name();
    

    using this class

    public static class ObjectInstanceExtensions
    {
        private static Dictionary<object, string> namedInstances = new Dictionary<object, string>();
    
        public static void Named<T>(this T instance, Expression<Func<T>> expressionContainingOnlyYourInstance)
        {
            var name = ((MemberExpression)expressionContainingOnlyYourInstance.Body).Member.Name;
            instance.Named(name);            
        }
    
        public static T Named<T>(this T instance, string named)
        {
            if (namedInstances.ContainsKey(instance)) namedInstances[instance] = named;
            else namedInstances.Add(instance, named);
            return instance;
        }        
    
        public static string Name<T>(this T instance)
        {
            if (namedInstances.ContainsKey(instance)) return namedInstances[instance];
            throw new NotImplementedException("object has not been named");
        }        
    }
    

    Code tested and most elegant I can come up with.

    0 讨论(0)
  • 2020-11-22 04:44

    No. A reference to your string variable gets passed to the funcion--there isn't any inherent metadeta about it included. Even reflection wouldn't get you out of the woods here--working backwards from a single reference type doesn't get you enough info to do what you need to do.

    Better go back to the drawing board on this one!

    rp

    0 讨论(0)
  • 2020-11-22 04:45

    Well had a bit of look. of course you can't use any Type information. Also, the name of a local variable is not available at runtime because their names are not compiled into the assembly's metadata.

    0 讨论(0)
提交回复
热议问题