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