我想为所有类创建一个通用方法,-->
RestMethods.ClearAllStaticValues(this);
所以这里我将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);
你可以通过一个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
这种清除静态整型的方法很慢。从类中删除所有整数值是一种创造性的方法,但是当您引入希望清除的所有其他对象类型时,这将变得更慢。
我的测试运行了这个过程50,000次,所以本质上两者都不是"慢"的,但相对而言,您的方法是接近的。比传统方法慢700倍。
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个字符串变量,您将看到您的方法仍然需要时间来查找字符串,即使不存在字符串。
不使用反射,而是使用接口:
interface ClearValues
{
void ClearStaticValues();
}
class AnyClass : ClearValues
{
private static int A, B, C;
public void ClearStaticValues()
{
A = 0;
B = 0;
C = 0;
}
}
现在让你所有的对象派生出这个接口,然后你可以调用.ClearStaticValues()
。
这允许您为每个类定制您的ClearStaticValues
方法。