C# 条件对象创建
好的,很明显我在.NET中迷失了方向,因为它不是我通常使用的代码。我试图在解析配置文件期间创建一个对象数组,以便在帧处理期间尽可能快速高效地处理它们。我一直在互联网上搜寻我应该做的事情,但要么我不知道搜索的正确术语,要么我走错了路 下面是一段代码,它试图循环遍历一个JSON文件,并将预先生成的类和配置值分配到一个对象数组中,希望以每秒60帧的速度遍历这些对象C# 条件对象创建,c#,json,C#,Json,好的,很明显我在.NET中迷失了方向,因为它不是我通常使用的代码。我试图在解析配置文件期间创建一个对象数组,以便在帧处理期间尽可能快速高效地处理它们。我一直在互联网上搜寻我应该做的事情,但要么我不知道搜索的正确术语,要么我走错了路 下面是一段代码,它试图循环遍历一个JSON文件,并将预先生成的类和配置值分配到一个对象数组中,希望以每秒60帧的速度遍历这些对象 public class UserConfig { public object[] myActions = { };
public class UserConfig {
public object[] myActions = {
};
public void processConfig() {
this.myActions.Clear();
string json = File.ReadAllText("config.json");
JToken jsonNodes = JToken.Parse( json );
WalkNode( jsonNodes, item => {
object newAction = new object{};
switch( item["bodyAction"].ToString() ) {
case "handLeftForward":
newAction.detector = new DetectArmForward( JointType.ShoulderLeft, JointType.HandLeft );
break;
}
switch( item["detectType"].ToString() ) {
case "distanceMin":
switch( newAction.detector.direction ) {
case "negative":
switch( newAction.detector.path ) {
case "Z":
newAction.detector.checker = new CheckNegativeDistanceMinZ( newAction.detector.jointBase, newAction.detector.jointEnd, item.distanceMin );
break;
}
break;
case "positive":
switch( newAction.detector.path ) {
case "Z":
newAction.detector.checker = new CheckPositiveDistanceMinZ( newAction.detector.jointBase, newAction.detector.jointEnd, item.distanceMin );
break;
}
break;
}
break;
}
switch( item["executeAction"].ToString() ) {
case "keyTap":
newAction.executer = new executeKeyTap( 123 );
break;
}
this.myActions[ this.myActions.Count() ] = newAction;
});
}
}
然后我希望我能做点像
for( action in this.myActions ) {
if( action.detector.checker.check( joints ) ) {
action.executer.execute( joints );
}
}
检查并有条件地执行从配置处理生成的方法
它不允许我使用这个设置(以及所有我尝试过的),因为对象必须预先声明,但我不知道我需要什么特定的对象。。。所以我迷路了:)
谢谢大家的关注 我可能忽略了一些东西,但您似乎在寻找命令
foreach
,而不是for。这在你的情况下应该很好
foreach(object action in this.myActions)
{
if( action.detector.checker.check( joints ) ) {
action.executer.execute( joints );
}
}
如果您只想将一个对象转储到容器中,然后从另一端取出一个数组,则可以定义一个列表:
var myList = new List<dynamic>();
myList.Add(someObject);
var myArray = myList.ToArray();
由新DetectArmForward创建的对象将被分配给该属性。听起来像是在尝试动态生成代码,您可能想看看DLR上运行的一种动态语言,如ironpython,它可能更适合此任务。动态组装对象,或者我所理解的元编程,在python或ruby中更直接?这似乎是可行的,但我想用正确的方式做事,不管是什么方式?需要动态生成不同方法的数组不是唯一的。我不觉得自己在这里有什么新突破,只是不确定正确的做事方式。谢谢您不只是创建数据对象并通过函数管道传递它们,有什么特别的原因吗?您不会执行附加到对象的方法,而是对对象的内容作出反应。这会稍微改变一些事情,因为该方法将在第一次求值时执行,但会在以后否定对foreach的需要。“checker.check()”方法所比较的数据在每个周期都会不同,这就是foreach以后的用途。因此,我基本上可以编译所有适当类的列表,然后在帧处理过程中直接运行它们。如果要使用IronPython,可以用Python编写一个库来执行对象操作,然后在命名空间中使用它。有一个静态方法,它接受一个对象和一个方法,并返回附加了该方法的对象。你也可以看看Roslyn,代码生成是该项目讨论的主要用例之一。谢谢:)但主要问题是无法创建我想循环使用的元素!我走这条路。这个应用程序比我在这里发布的要复杂得多,但这向我展示了我必须适应类型限制语言的真实心态:)
class myObject {
public dynamic detector;
public dynamic someOtherProperty;
}