Search code examples
c#wpfnon-statichelix-3d-toolkit

Helix 3D Toolkit - object reference is required for the non-static field


I try to load a 3d Model using an open file dialog so with a button click I can select an .obj file and display it :

Model3DGroup groupLoad  = HelixToolkit.Wpf.ModelImporter.Load("C:....");

    public static Model3DGroup Load(string path)
    {
        if (path == null)
        {
            return null;
        }

        Model3DGroup model = null;
        string ext = System.IO.Path.GetExtension(path).ToLower();
        switch (ext)
        {
            case ".3ds":
                {
                    var r = new HelixToolkit.Wpf.StudioReader();
                    model = r.Read(path);
                    break;
                }

            case ".lwo":
                {
                    var r = new HelixToolkit.Wpf.LwoReader();
                    model = r.Read(path);

                    break;
                }

            case ".obj":
                {
                    var r = new HelixToolkit.Wpf.ObjReader();
                    model = r.Read(path);
                    break;
                }

            case ".objz":
                {
                    var r = new HelixToolkit.Wpf.ObjReader();
                    model = r.ReadZ(path);
                    break;
                }

            case ".stl":
                {
                    var r = new HelixToolkit.Wpf.StLReader();
                    model = r.Read(path);
                    break;
                }

            case ".off":
                {
                    var r = new HelixToolkit.Wpf.OffReader();
                    model = r.Read(path);
                    break;
                }

            default:
                throw new InvalidOperationException("File format not supported.");
        }

        return model;
    }

To solve this issue:

An object reference is required for the non-static field, method, or property 'ModelImporter.Load(string,Dispatcher,bool)'

I have added this:

var importer = new HelixToolkit.Wpf.ModelImporter();
var groupLoad = importer.Load("C:....");

Anyone ideas, what could be wrong here?


Solution

  • The problem is that you try to call the Load method of ModelImporter. ModelImporter is a class and if you try to call a method of a class, then you are attempting to run a static method, that is, a method that is class-level. However, Load is instance level.

    Let me give you an example:

    If you have a Bird class, that represents all Bird objects and you call Bird.migrate() that is a method executed by all Bird objects. However, if you instantiate Bird, you may call fly. In our example migrate is a method the Bird objects do together, while fly is an individual action. A Bird object can fly, but since fly is an instance-level action, it cannot be executed by all the birds.

    To remedy this problem, since Load is an instance-level method, you will have to instantiate the class:

    ModelImporter import = new ModelImporter();  
    device = import.Load(model);
    

    Here you create an individual ModelImporter instance and thus, Load will be accessible through it. If a method is static, then it is class-level, otherwise it is instance-level.