是否可以从函数中检查参数是否为静态变量?
这将帮助我防止出现拼写错误的可能性,在这种情况下,用户尝试快速设置单身人士,但忘记在提供之前将自己的instance
成员声明为static
通过ref
这是我的功能:
// returns 'false' if failed, and the object will be destroyed.
// Make sure to return from your own init-function if 'false'.
public static bool TrySet_SingletonInstance<T>(this T c, ref T instance) where T : Component {
//if(instance is not static){ return false } //<--hoping for something like this
if(instance != null){
/* cleanup then return */
return false;
}
instance = c;
return true;
}
答案 0 :(得分:2)
如果我们假设您的单例类只有一个静态实例(这很有意义,因为它是 single ton),那么我们可以使用该类型来查找字段。在这种情况下,实际上根本不需要将其传递给它。而且,由于我们知道如何获取FieldInfo,因此可以通过Reflection判断它是否是静态的。
public static bool TrySet_SingletonInstance<T>(this T c) where T : Component
{
//Find a static field of type T defined in class T
var target = typeof(T).GetFields(BindingFlags.Static | BindingFlags.Public).SingleOrDefault(p => p.FieldType == typeof(T));
//Not found; must not be static or public, or doesn't exist. Return false.
if (target == null) return false;
//Get existing value
var oldValue = (T)target.GetValue(null);
//Old value isn't null. Return false.
if (oldValue != null) return false;
//Set the value
target.SetValue(null, c);
//Success!
return true;
}
用法:
var c = new MySingleton();
var ok = c.TrySet_SingletonInstance();
Console.WriteLine(ok);
在此处查看有效的示例:DotNetFiddle