c #: проверить, действительно ли аргумент 'ref' исходит из статической переменной - PullRequest
0 голосов
/ 01 декабря 2018

Есть ли способ проверить изнутри функции, является ли аргумент статической переменной?

Это помогло бы мне предотвратить любую возможность опечаток , когда пользователь пытается быстро настроитьsingleton, но забывает объявить свой собственный 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 голосов
/ 01 декабря 2018

Если мы предположим, что ваши одноэлементные классы имеют один и только один статический экземпляр (что имеет смысл, так как это один тонна), мы можем найти поле, используя тип.В этом случае фактически нет необходимости передавать его в ссылке на него вообще.И так как мы знаем, как получить 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...