Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#:检查a';参考';参数实际上来自一个静态变量_C#_Unity3d - Fatal编程技术网

c#:检查a';参考';参数实际上来自一个静态变量

c#:检查a';参考';参数实际上来自一个静态变量,c#,unity3d,C#,Unity3d,如果参数是静态变量,有没有办法从函数内部检查 这将帮助我防止任何可能的打字错误用户试图快速设置一个单例,但忘记将自己的实例成员声明为静态,然后通过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_SingletonIn

如果参数是静态变量,有没有办法从函数内部检查

这将帮助我防止任何可能的打字错误用户试图快速设置一个单例,但忘记将自己的
实例
成员声明为
静态
,然后通过
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;
}
//如果失败,则返回'false',对象将被销毁。
//如果“false”,请确保从您自己的init函数返回。
公共静态bool TrySet_singletonistance(此tc,ref T实例),其中T:Component{

//如果(实例不是静态的){return false}/如果我们假设您的单例类只有一个静态实例(这是有意义的,因为它是单例的),我们可以使用类型找到字段。在这种情况下,实际上根本不需要在引用中传递它。而且,由于我们知道如何获取字段信息,我们可以通过反射来判断它是否是静态的

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;
}

请参阅此处的工作示例:

如果我们假设您的单例类只有一个静态实例(这很有意义,因为它是单例的),我们可以使用类型找到字段。在这种情况下,实际上根本不需要在引用中传递它。而且,由于我们知道如何获取字段信息,我们可以通过反射来判断它是否是静态的

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;
}

请参阅此处的一个工作示例:

如果不可能,-一种方法是使用不同的参数名称。例如
ref T instance\u VERIFY\u是静态的
。是的,很难看,但会让任何试图使用我们函数的人清醒过来。我认为您可以使用反射来获取有关的信息。请参阅:如果不可能,-一种方法这将使用一个不同的参数名称。例如
ref T instance\u VERIFY\u IS\u STATIC
。是的,很难看,但会让任何试图使用我们函数的人清醒过来。我想你可以使用反射来获取有关的信息。我不明白:我不明白的是,为什么你会有一个方法来设置单例,而不是单例ASSINGctor中的赋值?我看不到这里面的附加值。如果只是想知道赋值是否通过,那么可以检查(c==MySingleton.Instance),这会告诉你singleton是否指向那个实例对象。我觉得问题更多的是在OP的设计中。更好的问题是我使用Unity,并且很长一段时间以来与构造函数有一些问题。如果我记得的话,它们在编辑过程中被多次调用,所以经过无数个小时的黑客攻击后,我将代码转移到了其他地方仅限运行时的初始化函数。这都是关于初始化的,以及许多脚本初始化的顺序,这些初始化必须间隔至少2帧。也许还有一些事情不记得了。我不明白的是,为什么你会有一个方法来设置单例,而不是在ctor中指定单例?我不知道如果这一点只是想知道任务是否完成,那么您可以检查(c==MySingleton.Instance),这会告诉你singleton是否指向那个实例对象。我觉得问题更多的是在OP的设计中。更好的问题是我使用Unity,并且很长一段时间以来与构造函数有一些问题。如果我记得的话,它们在编辑过程中被多次调用,所以经过无数个小时的黑客攻击后,我将代码转移到了其他地方仅限运行时的初始化函数。这都是关于初始化的,以及许多脚本初始化的顺序,这些初始化必须间隔至少2帧。也许还有一些东西不记得了。