I am new with C#, I have this error with my class.
Extension method must be defined in a non-generic static class
I just searched and found many reasons that could make this error..such as adding static to class name and other..Can you help me find why this error comes for class?
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace LandManagment
{
class weather
{
private string xml;
private string FullTextXML;
private string PartTextXML;
public List<Forcast> forcastlist;
public Wind wind;
public Astronomy astronomy;
public Atmosphere atmosphere;
public Condition condition;
public struct Forcast
{
public Forcast(string day, string date, string low, string high, string text, string code)
{
Day = day;
Date = date;
Low = low;
High = high;
Text = text;
Code = code;
}
public string Day { get; private set; }
public string Date { get; private set; }
public string Low { get; private set; }
public string High { get; private set; }
public string Text { get; private set; }
public string Code { get; private set; }
}
public struct Wind
{
public Wind(string chill, string direction, string speed)
{
Chill = chill;
Direction = direction;
Speed = speed;
}
public string Chill { get; private set; }
public string Direction { get; private set; }
public string Speed { get; private set; }
}
public struct Astronomy
{
public Astronomy(string sunrise, string sunset)
{
Sunrise = sunrise;
Sunset = sunset;
}
public string Sunrise { get; private set; }
public string Sunset { get; private set; }
}
public struct Atmosphere
{
public Atmosphere(string humidity, string visibility, string pressure, string rising)
{
Humidity = humidity;
Visibility = visibility;
Pressure = pressure;
Rising = rising;
}
public string Humidity { get; private set; }
public string Visibility { get; private set; }
public string Pressure { get; private set; }
public string Rising { get; private set; }
}
public struct Condition
{
public Condition(string text, string code, string temp)
{
Text = text;
Code = code;
Temp = temp;
}
public string Text { get; private set; }
public string Code { get; private set; }
public string Temp { get; private set; }
}
private string GetStr(string str) {
try {
int index1;
int index2;
index1 = (str.IndexOf("<![CDATA[") + "<![CDATA[".Length);
index2 = str.IndexOf("]]>");
string str1 = str.Substring(index1, (index2 - index1));
// MsgBox(str1)
return str1;
}
catch (Exception ex) {
return "Error";
}
}
private string getXML() {
return FullTextXML;
}
private void GetWind() {
int index1;
int index2;
string NewString;
index1 = (PartTextXML.IndexOf("<yweather:wind") + "<yweather:wind".Length);
NewString = PartTextXML.Substring(index1);
index2 = NewString.IndexOf("/>");
string TodayWind= NewString.Substring(0, index2).ToLower();
//speed
index1 = TodayWind.IndexOf("speed");
string NewStr = TodayWind.Substring(index1);
index2 = NewStr.IndexOf(" ");
string ss = NewStr.Substring(0, index2);
string[] arr = ss.Split('=');
string speed = FormatString(arr[1].Replace("\"", ""));
//direction
index1 = TodayWind.IndexOf("direction");
NewStr = TodayWind.Substring(index1);
index2 = NewStr.IndexOf(" ");
ss = NewStr.Substring(0, index2);
arr = ss.Split('=');
string direction = FormatString(arr[1].Replace("\"", ""));
//chill
index1 = TodayWind.IndexOf("chill");
NewStr = TodayWind.Substring(index1);
index2 = NewStr.IndexOf(" ");
ss = NewStr.Substring(0, index2);
arr = ss.Split('=');
string chill = FormatString(arr[1].Replace("\"", ""));
wind = new Wind(speed, direction, chill);
}
public void GetAstronomy() {
int index1;
int index2;
string NewString;
index1 = (PartTextXML.IndexOf("<yweather:astronomy") + "<yweather:astronomy".Length);
NewString = PartTextXML.Substring(index1);
index2 = NewString.IndexOf("/>");
String TodayAstronomy = NewString.Substring(0, index2).ToLower();
//sunrise
index1 = TodayAstronomy.IndexOf("sunrise");
string NewStr = TodayAstronomy.Substring(index1);
index2 = NewStr.IndexOf(" am");
string ss = NewStr.Substring(0, index2);
string[] arr = ss.Split('=');
String sunrise = (FormatString(arr[1].Replace("\"", "")) + "am");
//sunset
index1 = TodayAstronomy.IndexOf("sunset");
NewStr = TodayAstronomy.Substring(index1);
index2 = NewStr.IndexOf(" pm");
ss = NewStr.Substring(0, index2);
arr = ss.Split('=');
String sunset = (FormatString(arr[1].Replace("\"", "")) + "pm");
astronomy = new Astronomy(sunrise, sunset);
}
private void GetAtmosphere()
{
int index1;
int index2;
string NewString;
index1 = (PartTextXML.IndexOf("<yweather:atmosphere") + "<yweather:atmosphere".Length);
NewString = PartTextXML.Substring(index1);
index2 = NewString.IndexOf("/>");
string TodayAtmosphere = NewString.Substring(0, index2).ToLower();
//humidity
index1 = TodayAtmosphere.IndexOf("humidity");
string NewStr = TodayAtmosphere.Substring(index1);
index2 = NewStr.IndexOf(" ");
string ss = NewStr.Substring(0, index2);
string[] arr = ss.Split('=');
string humidity = FormatString(arr[1].Replace("\"", ""));
//visibility
index1 = TodayAtmosphere.IndexOf("visibility");
NewStr = TodayAtmosphere.Substring(index1);
index2 = NewStr.IndexOf(" ");
ss = NewStr.Substring(0, index2);
arr = ss.Split('=');
string visibility = FormatString(arr[1].Replace("\"", ""));
//pressure
index1 = TodayAtmosphere.IndexOf("pressure");
NewStr = TodayAtmosphere.Substring(index1);
index2 = NewStr.IndexOf(" ");
ss = NewStr.Substring(0, index2);
arr = ss.Split('=');
string pressure = FormatString(arr[1].Replace("\"", ""));
//rising
index1 = TodayAtmosphere.IndexOf("rising");
NewStr = TodayAtmosphere.Substring(index1);
index2 = NewStr.IndexOf(" ");
ss = NewStr.Substring(0, index2);
arr = ss.Split('=');
string rising = FormatString(arr[1].Replace("\"", ""));
atmosphere = new Atmosphere(humidity, visibility, pressure, rising);
}
private void GetCondition()
{
int index1;
int index2;
string NewString;
index1 = (PartTextXML.IndexOf("<yweather:condition") + "<yweather:condition".Length);
NewString = PartTextXML.Substring(index1);
index2 = NewString.IndexOf("/>");
String TodayCondition = NewString.Substring(0, index2).ToLower();
//temp
index1 = TodayCondition.IndexOf("temp");
string NewStr = TodayCondition.Substring(index1);
index2 = NewStr.IndexOf(" ");
string ss = NewStr.Substring(0, index2);
string[] arr = ss.Split('=');
string temp = FormatString(arr[1].Replace("\"", ""));
//code
index1 = TodayCondition.IndexOf("code");
NewStr = TodayCondition.Substring(index1);
index2 = NewStr.IndexOf(" ");
ss = NewStr.Substring(0, index2);
arr = ss.Split('=');
string code = FormatString(arr[1].Replace("\"", ""));
//text
index1 = TodayCondition.IndexOf("text");
NewStr = TodayCondition.Substring(index1);
index2 = NewStr.IndexOf(" ");
ss = NewStr.Substring(0, index2);
arr = ss.Split('=');
string text = FormatString(arr[1].Replace("\"", ""));
condition = new Condition(text, code, temp);
}
public void GetForecast()
{
for (int i = 0; i < 2; i++)
{
int index1;
int index2;
string NewString;
index1 = (NthIndexOf(PartTextXML, "<yweather:astronomy", i+1) + "<yweather:astronomy".Length);
NewString = PartTextXML.Substring(index1);
index2 = NewString.IndexOf("/>");
string forc=NewString.Substring(0, index2).ToLower();
//low
index1 = forc.IndexOf("low");
string NewStr = forc.Substring(index1);
index2 = NewStr.IndexOf(" ");
string ss = NewStr.Substring(0, index2);
string[] arr = ss.Split('=');
String Low = arr[1].Replace("\"", "");
//high
index1 = forc.IndexOf("high");
NewStr = forc.Substring(index1);
index2 = NewStr.IndexOf(" ");
ss = NewStr.Substring(0, index2);
arr = ss.Split('=');
String High = arr[1].Replace("\"", "");
//text
index1 = forc.IndexOf("text");
NewStr = forc.Substring(index1);
index2 = NewStr.IndexOf(" ");
ss = NewStr.Substring(0, index2);
arr = ss.Split('=');
String text = arr[1].Replace("\"", "");
//text
index1 = forc.IndexOf("code");
NewStr = forc.Substring(index1);
index2 = NewStr.IndexOf(" ");
ss = NewStr.Substring(0, index2);
arr = ss.Split('=');
String code = arr[1].Replace("\"", "");
//day
index1 = forc.IndexOf("day");
NewStr = forc.Substring(index1);
index2 = NewStr.IndexOf(" ");
ss = NewStr.Substring(0, index2);
arr = ss.Split('=');
String day = arr[1].Replace("\"", "");
//date
index1 = forc.IndexOf("date");
NewStr = forc.Substring(index1);
index2 = NewStr.IndexOf(" ");
ss = NewStr.Substring(0, index2);
arr = ss.Split('=');
String date = arr[1].Replace("\"", "");
forcastlist.Insert(i,new Forcast(day,date,Low,High,text,code));
}
}
private static int NthIndexOf(this string target, string value, int n)
{
Match m = Regex.Match(target, "((" + value + ").*?){" + n + "}");
if (m.Success)
return m.Groups[2].Captures[n - 1].Index;
else
return -1;
}
public weather(string w, string U) {
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
string str = ("http://xml.weather.yahoo.com/forecastrss?w="
+ (w + ("&u=" + U)));
try {
// Load data
doc.Load(str);
str = doc.OuterXml;
FullTextXML = doc.OuterXml;
PartTextXML = GetStr(str);
this.GetAstronomy();
this.GetAtmosphere();
this.GetCondition();
this.GetForecast();
}
catch (Exception ex) {
str = "null";
FullTextXML = "null";
throw new Exception("Null XML");
}
}
private string FormatString(String sss) {
char c = sss[0];
c = c.ToString().ToUpper()[0];
string str="";
str = (c + sss.Substring(1));
return str;
}
}
}
I tried to change public static class
as Extension methods must be defined in a non-generic static class said but got error :( thanks for your help
Since NthIndexOf
is an extension method, it needs to be defined in public static class
. I suspect you've made weather
a public static class
eg:
public static class weather
{
}
However, this wont work since weather
contains non-static instance members eg
private string xml;
private string FullTextXML;
private string PartTextXML;
public List<Forcast> forcastlist;
// etc...
What you should do is create a separate class to store your extension method in, something like:
public static class StringExtensions
{
public static int NthIndexOf(this string target, string value, int n)
{
Match m = Regex.Match(target, "((" + value + ").*?){" + n + "}");
if (m.Success)
return m.Groups[2].Captures[n - 1].Index;
else
return -1;
}
}
You would call this from your weather
class like so:
int y = PartTextXML.NthIndexOf("<yweather:astronomy", i + 1);
You have to place this method:
private static int NthIndexOf(this string target, string value, int n)
{
Match m = Regex.Match(target, "((" + value + ").*?){" + n + "}");
// I changed a bit your code here.
return m.Success ? m.Groups[2].Captures[n - 1].Index : -1;
}
inside a static class. This is an extension
method and all extensions methods should be placed inside a static
class. If you call this calls Extensions
, then it should be like below:
static public class Extension
{
public static int NthIndexOf(this string target, string value, int n)
{
Match m = Regex.Match(target, "((" + value + ").*?){" + n + "}");
if (m.Success)
return m.Groups[2].Captures[n - 1].Index;
else
return -1;
}
}
How do we call an extension method?
input.NthIndexOf(value, n);
where input
is our string.
For more information about extension methods, please have a look here .
您的NthIndexOf方法不在静态类中 - 要使扩展方法起作用,必须在静态类中定义它们。
1 - Do as the above correct answers tell, move "NthIndexOf" function to a public static class.
public static class StringExtensions
{
public static int NthIndexOf(this string target, string value, int n)
{
Match m = Regex.Match(target, "((" + value + ").*?){" + n + "}");
if (m.Success)
return m.Groups[2].Captures[n - 1].Index;
else
return -1;
}
}
2 - In GetForecast function change the place where you call the function as
instead of:
index1 = (NthIndexOf(PartTextXML, "<yweather:astronomy", i+1) + "<yweather:astronomy".Length);
do this:
index1 = (StringExtensions.NthIndexOf(PartTextXML, "<yweather:astronomy", i+1) + "<yweather:astronomy".Length);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.