C#:检查“ ref”参数是否实际上来自静态变量

时间:2018-11-30 23:36:54

标签: c# unity3d

是否可以从函数中检查参数是否为静态变量?

这将帮助我防止出现拼写错误的可能性,在这种情况下,用户尝试快速设置单身人士,但忘记在提供之前将自己的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;
}

1 个答案:

答案 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