2013-05-16 37 views
0

所以我对编程相当陌生,我试图通过尝试很多东西来学习新事物。但在现阶段,我就死在什么......C#是否有可能从一个类中的属性调用方法?

基本上,我想做到的是要能使用下面的代码行: Url.QueryStringParser.HasParam("");网址是类,QueryStringParser一个URL类中属性HasParamQueryStringParser类中的一种方法。 它的工作,预计的事实,我得到NullReferenceExceptionQueryStringParser属性。我不知道为什么会发生这种情况...

这是Url类。

public class Url 
{ 
    public static QueryStringParser QueryStringParser { get; private set;} 
} 

这是QueryStringParser类。

public class QueryStringParser 
{ 
    public bool HasParam(string parameter) 
    { 
     return !string.IsNullOrEmpty(HttpContext.Current.Request[parameter]); 
    } 
} 

这是我的asp.net网页。

if (Url.QueryStringParser.HasParam("Id")) 
{ 
    // Do stuff. 
} 

所以我的问题是,如果有可能创建一些东西,我刚刚提到上面?

+1

试试吧。它是否编译?它运行吗?这是一个问题的例子,你可以通过尝试自己和玩耍来得到更快的答案,而不是问这里。 – Oded

+1

试试吧。它有用吗?如果不是,出了什么问题?这是你应该问的问题。 – Jeff

回答

2

你的问题就在于该财产QueryStringParser,要调用的方法HasParam,需要的一个实例对象QueryStringParser(错误的名称选择)。这个实例永远不会被你的代码创建,因此NullReferenceException。
所以,你需要改变一点在获取代码,然后设置你的财产

public class Url 
{ 
    private static QueryStringParser _qsp = null; 
    public static QueryStringParser QueryStringParser 
    { 
     get 
     { 
      if(_qsp == null) _qsp = new QueryStringParser(); 
      return _qsp; 
     } 
     private set 
     { 
      _qsp = value; 
     } 
    } 
} 

随着这一变化的,当你需要的财产你的代码将检查它是否为空,并初始化用于内部对象存储QueryStringParser的实例,然后返回这个实例。

绕过异常的另一种可能性是使HasParam方法也是静态的,在这种情况下,您不需要对象QueryStringParser的实例。

顺便说一下,虽然它的工作原理,我觉得有一个属性命名为一个类非常混乱。我建议选择另一名称为房地产QueryStringParser

+0

好的,谢谢你的解释^。^我会更多地尝试这些东西,并在互联网上阅读更多关于它的内容,以便完全理解这一切。 – Rick

0

所有你需要做的是给它分配的URL的静态构造函数实例:

public class Url 
{ 
    public static Url() 
    { 
     QueryStringParser = new QueryStringParser(); 
    } 

    public static QueryStringParser QueryStringParser { get; private set;} 
} 
0
public class Url 
{ 
    public static QueryStringParser QueryStringParser { get; private set; } 
} 

这是不对的,你需要做的类的实例,使其访问其方法和属性。我认为这将是一个很好的学习练习,让你研究这个并解决它。

相关问题