using System.Collections.Generic;
using System.Threading.Tasks;
class MySingleton : Component
static public MySingleton Instance = null;
class MyMistake : Component
public MyMistake Instance = null;
static class ExtensionMethods
public static bool TrySet_SingletonInstance<T>(this T c) where T : Component
var target = typeof(T).GetFields(BindingFlags.Static | BindingFlags.Public).SingleOrDefault(p => p.FieldType == typeof(T));
if (target == null) return false;
var oldValue = (T)target.GetValue(null);
if (oldValue != null) return false;
target.SetValue(null, c);
static public void Main()
var singleton = new MySingleton();
var ok = singleton.TrySet_SingletonInstance();
var mistake = new MyMistake();
var oops = mistake.TrySet_SingletonInstance();