2011-12-25 143 views
0

我有这个寄存器,寄存器中的所有对象,我需要:堆栈溢出

public static class ObjectRegister 
{ 
    public static List<IObject> RegisteredObjects = new List<IObject>(); 
    static ObjectRegister() 
    { 
     RegisteredObjects.Add(new Object1()); 
     RegisteredObjects.Add(new Object2()); 
     RegisteredObjects.Add(new Object3()); 
    } 
} 

接下来,我有这个功能,它检查一个列表,如果该列表中的项目通过测试,它创建了一个对象实例,并将其添加到列表:

public static List<IObject> Scan(List<parametar> list) 
    { 
     List<IObject> neededObjects = new List<IObject>(); 
     foreach (IObject registeredObject in ObjectRegister.RegisteredObjects) 
     { 
      foreach (parametar param in list) 
      { 
       if (registeredObject.Test(param)) //returns true or false 
       { 
        neededObjects.Add(registeredObject.CreateInstance(param)); 
       } 
      } 
     } 
     return connectedObjects; 
    } 

这里是Object1的CreateInstace方法:

public IObject CreateInstance(parametar param) 
    { 
     return new Object1(param); 
    } 

这里是构造函数:

public Object1(parametar newParam) 
    { 
     this.param = newParam; 
    } 

该公司密切关注该行trowing StackOverflow的例外:

this.param = newParam; 

尝试了所有的可能性,创建一个实例,默认的构造函数,空对象等等等等,但是毫无效果... 有任何想法吗?

感谢名单

编辑: 代码发送到Object1类:

public class Object1: IObject 
{ 
    public parametar param 
    { 
     get { return this.param; } 
     set { this.param = value; } 
    } 

    internal Object1() { } 

    public Object1(parametar newParam) 
    { 
     this.param = newParam; 
    }   


    public bool test(parametar param) 
    { 
     // I do the propper checking of the param here, and return the result 
    } 


    public IObject CreateInstance(parametar param) 
    { 
     return new Object1(param); 
    } 
} 
+0

您需要显示Object1类的代码。 – 2011-12-25 17:35:48

+3

看看调用堆栈。 – SLaks 2011-12-25 17:36:00

+2

你真的有一个叫'parametar'的班吗? – 2011-12-25 17:39:35

回答

9

这是你的问题,在Object1:

public parametar param { get { return this.param; } set { this.param = value; } 

该属性递归调用自己 - 这也正是为什么你会遇到堆栈溢出。不要这样做。相反,你可能要么想要一个自动实现的属性:

public parameter param { get; set; } 

或使用专用支持字段:

private parametar param; 
public parametar Param { get { return param; } set { param = value; } 

此外,我强烈建议你开始按照.NET naming conventions,并支付注意类型和成员名称中的拼写。

所以你可能希望你的班级被称为Parameter - 尽管我个人至少尝试使它更具描述性,例如, QueryParameter或类似的东西。同样Object1不完全是一个语义上有意义的名字 - 我希望它不是您的真实代码中的名称。

+0

谢谢:)那是问题 – GregoryHouseMD 2011-12-25 17:48:58