是否有可能从另一个函数检测使用的变量并访问该变量?

时间:2013-05-10 16:07:50

标签: c# scope using

我有一个调用另一个函数的函数。我想知道在第二个函数中是否可以检测是否正在使用范围内的第一个函数调用它。如果我能检测到它,我想访问使用范围内的变量。我无法通过参数发送变量。

例如:

// Normal call to OtherFunction
void function1()
{
    SomeClass.OtherFunction();
}


// Calling using someVar
void function2()
{
    using(var someVar = new someVar())
    {
        SomeClass.OtherFunction();
    }
}

// Calling using other variable, in this case, similar behaviour to function1()
void function3()
{
    using(var anotherVar = new anotherVar())
    {
        SomeClass.OtherFunction();
    }
}

class SomeClass
{
    static void OtherFunction()
    {
         // how to know if i am being called inside a using(someVar)
         // and access local variables from someVar
    }
}

2 个答案:

答案 0 :(得分:2)

您可以使用与System.Transaction.TransasctionScope相同的机制。这仅适用于所有上下文都可以具有相同基类的情况。基层在施工期间将自己注册为静态财产,并在处置时自行移除。如果另一个Context已经处于有效状态,则会被推迟,直到再次处置最新的Context为止。

using System;

namespace ContextDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            DetectContext();
            using (new ContextA())
                DetectContext();
            using (new ContextB())
                DetectContext();
        }

        static void DetectContext()
        {
            Context context = Context.Current;
            if (context == null)
                Console.WriteLine("No context");
            else 
                Console.WriteLine("Context of type: " + context.GetType());
        }
    }

    public class Context: IDisposable
    {
        #region Static members

        [ThreadStatic]
        static private Context _Current;

        static public Context Current
        {
            get
            {
                return _Current;
            }
        }

        #endregion

        private readonly Context _Previous;

        public Context()
        {
            _Previous = _Current;
            _Current = this;
        }

        public void Dispose()
        {
            _Current = _Previous;
        }
    }

    public class ContextA: Context
    {
    }

    public class ContextB : Context
    {
    }
}

答案 1 :(得分:0)

为您可以从Someclass.OtherFunction()中访问的变量创建公共getter,并根据调用的函数设置变量值,以便识别调用者。