0

我想为所有类创建一个通用方法,--->

RestMethods.ClearAllStaticValues(this);

所以在这里我将它作为一个参数传递,这是一个类引用。但是我怎么能在我的方法定义中捕捉到这一点,我正在处理类字段(使用反射),目前我正在同一个类中这样做。下面的代码--->

var varList = this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Static).ToList();
varList.Where(x => x.FieldType == typeof(Int32)).ToList().ForEach(x => x.SetValue(this, 0)); 

注意:我不想这样使用它--->

Class A
{
     RestMethods.ClearAllStaticValues(this);
}

&方法定义--->

RestMethods.ClearAllStaticValues(A args);

因为它将特定于类。

4

3 回答 3

4

您可能只需传递一个Type

public static void ClearAllStaticValues(Type t)
{
    var varList = t.GetFields(BindingFlags.NonPublic | BindingFlags.Static);
    varList.Where(x => x.FieldType == typeof(Int32)).ToList().ForEach(x => x.SetValue(null, 0)); 
}

像这样称呼它:

public class A
{
    public static void Clear()
    {
        //static member 
        RestMethods.ClearAllStaticValues(typeof(A));
    }
    public void ClearInstance()
    {
        //instance member
        RestMethods.ClearAllStaticValues(GetType());
    }
}

这是一个演示:http: //ideone.com/oYQh5X

于 2013-05-13T05:30:19.113 回答
0

这种清除静态 int 的方法很慢。这是一种从类中删除所有整数值的创造性方法,但是当您引入要清除的所有其他对象类型时,这会变得更慢。

我的测试运行这个过程 50,000 次,所以本质上都不是“慢”,但相对而言你的方法是大约。比传统方法慢 700X。

    static void Main(string[] args)
    {
        Stopwatch sw = Stopwatch.StartNew();

        for (int i = 0; i < 50000; i++)
        {
            HasStaticObjects hso1 = new HasStaticObjects();
            ClearAllStaticValues(hso1);
        }
        Console.WriteLine("Clear Generic Static Values: \n" + sw.Elapsed);

        sw.Restart();
        for (int i = 0; i < 50000; i++)
        {
            HasStaticObjects hso2 = new HasStaticObjects();
            hso2.ClearStaticValues();
        }
        Console.WriteLine("Clear Static Values: \n" + sw.Elapsed);
        Console.ReadLine();
    }

    public static void ClearAllStaticValues<T>(T currentClass)
    {
        var varList = currentClass.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Static).ToList();
        varList.Where(x => x.FieldType == typeof(Int32)).ToList().ForEach(x => x.SetValue(null, 0));
        varList.Where(x => x.FieldType == typeof(string)).ToList().ForEach(x => x.SetValue(null, ""));
    }
}

class HasStaticObjects
{
    private static int A, B, C;
    private static string D, E, F;
    public HasStaticObjects()
    {
        A = 1;
        B = 2;
        C = 3;
        D = "Hi";
        E = "Good";
        F = "Fast";
    }
    public void ClearStaticValues()
    {
        A = 0;
        B = 0;
        C = 0;
        D = "";
        E = "";
        F = "";
    }

您需要接受的其他情况是当对象不包含整数或不包含字符串时,您的方法的性能将如何受到影响?

在测试中,从HasStaticObjects类中删除 3 个字符串变量,您会看到即使不存在字符串,您的方法仍然需要时间来查找字符串。

于 2013-05-13T06:35:35.773 回答
0

不要使用反射,而是使用接口:

interface ClearValues
{
    void ClearStaticValues();
}
class AnyClass : ClearValues
{
    private static int A, B, C;
    public void ClearStaticValues()
    {
        A = 0;
        B = 0;
        C = 0;
    }
}

现在让您的所有对象都派生该接口,然后您可以调用 .ClearStaticValues().

这允许您ClearStaticValues为每个类定制您的方法。

于 2013-05-13T07:02:08.187 回答