Helix 3D Toolkit - 非静态字段需要对象引用
Helix 3D Toolkit - object reference is required for the non-static field
我尝试使用打开的文件对话框加载 3d 模型
所以通过单击按钮,我可以 select 一个 .obj 文件并显示它:
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;
}
解决这个问题:
An object reference is required for the non-static field, method, or
property 'ModelImporter.Load(string,Dispatcher,bool)'
我添加了这个:
var importer = new HelixToolkit.Wpf.ModelImporter();
var groupLoad = importer.Load("C:....");
任何人的想法,这里可能有什么问题?
问题是您尝试调用 ModelImporter
的 Load
方法。 ModelImporter
是一个 class
,如果您尝试调用 class
的方法,那么您正在尝试 运行 一个 static
方法,即class级别的方法。但是,Load
是实例级别。
举个例子:
如果你有一个 Bird
class
,代表所有 Bird
对象,你调用 Bird.migrate()
这是所有 Bird
对象执行的方法.但是,如果你实例化Bird
,你可能会调用fly
。在我们的示例中,migrate
是 Bird
对象一起执行的方法,而 fly
是单独的操作。一个Bird
对象可以fly
,但是由于fly
是一个实例级别的动作,它不能被所有的鸟执行。
要解决此问题,因为 Load
是实例级方法,您必须实例化 class
:
ModelImporter import = new ModelImporter();
device = import.Load(model);
在这里您创建了一个单独的 ModelImporter
实例,因此可以通过它访问 Load
。如果一个方法是static
,那么它是class
级的,否则就是实例级的。
我尝试使用打开的文件对话框加载 3d 模型 所以通过单击按钮,我可以 select 一个 .obj 文件并显示它:
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;
}
解决这个问题:
An object reference is required for the non-static field, method, or property 'ModelImporter.Load(string,Dispatcher,bool)'
我添加了这个:
var importer = new HelixToolkit.Wpf.ModelImporter();
var groupLoad = importer.Load("C:....");
任何人的想法,这里可能有什么问题?
问题是您尝试调用 ModelImporter
的 Load
方法。 ModelImporter
是一个 class
,如果您尝试调用 class
的方法,那么您正在尝试 运行 一个 static
方法,即class级别的方法。但是,Load
是实例级别。
举个例子:
如果你有一个 Bird
class
,代表所有 Bird
对象,你调用 Bird.migrate()
这是所有 Bird
对象执行的方法.但是,如果你实例化Bird
,你可能会调用fly
。在我们的示例中,migrate
是 Bird
对象一起执行的方法,而 fly
是单独的操作。一个Bird
对象可以fly
,但是由于fly
是一个实例级别的动作,它不能被所有的鸟执行。
要解决此问题,因为 Load
是实例级方法,您必须实例化 class
:
ModelImporter import = new ModelImporter();
device = import.Load(model);
在这里您创建了一个单独的 ModelImporter
实例,因此可以通过它访问 Load
。如果一个方法是static
,那么它是class
级的,否则就是实例级的。