Замена типа данных VAR в .NET 2.0

Я использую .NET 2.0, здесь нужно реализовать тип данных VAR:

var doc = XDocument.Parse(result);
var sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();
if (sw != null)
{
   var lat = (double)sw.Element("lat");
   var lng = (double)sw.Element("lng");
   // do stuff
}

Вместо этого я использовал STRING

public string getLatLang(string address)
{
    string latlang = "";
    string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false";
    System.Net.WebClient client = new System.Net.WebClient();
    string result = client.DownloadString(url);
    string doc = System.Xml.Linq.XDocument.Parse(result).ToString();
    string sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();
    if (sw != null)
    {
        string lat = (double)sw.Element("lat");
        string lng = (double)sw.Element("lng");
        latlang = lat + "," + lang;
        // do stuff
    }
    return latlang;
}

Но получаю ошибку:

'строка' не содержит определения для 'Потомков'

Помогите мне заменить здесь VAR.


person sajanyamaha    schedule 11.08.2012    source источник
comment
var сам по себе не является типом данных, но представляет тип, выведенный компилятором. Не все var переменные здесь имеют один и тот же тип. Начните сверху и двигайтесь вниз, чтобы определить каждый тип.   -  person Michael Graczyk    schedule 11.08.2012
comment
Я пытаюсь получить широту и долготу, используя карты Google в коде C #, и эта строка вызывает у меня проблемы: string sw = doc.Descendants (viewport) .Elements (southwest) .SingleOrDefault (); Ребята, вы можете мне помочь? Я понимаю, что не все переменные var здесь имеют один и тот же тип, но вот возможное решение здесь с .NET 2.0   -  person sajanyamaha    schedule 11.08.2012
comment
Также, если у вас есть Resharper, вы можете сделать это: stackoverflow.com/questions/289743/   -  person Michael Graczyk    schedule 11.08.2012


Ответы (4)


Чтобы заменить var, исследуйте фактический тип возвращаемого значения метода и измените его на этот. Например, XDocument.Parse можно найти в MSDN здесь В документации говорится: «Создает новый XDocument из строки», поэтому возвращаемый тип должен быть XDocument. И если вы углубитесь в одну из перегрузок метода (как этот ), вы увидите фактическую подпись метода, которая подтверждает, что он действительно возвращает XDocument.

Кроме того, в Visual Studio есть функция intellisense, поэтому, если вы наводите курсор на что-либо, вы обычно можете получить подробные сведения об этом. Попробуйте ввести System.Xml.Linq.XDocument.Parse(. Когда вы набираете первую скобку, вы должны увидеть всплывающее окно в Visual Studio, в котором сообщается, какой тип возвращаемого значения соответствует используемому вами методу. Если intellisense не работает, убедитесь, что у вас есть ссылка на DLL.

Также обратите внимание, что в Visual Studio есть так называемый Object Explorer. Это позволит вам увидеть сигнатуры методов каждого объекта, с которым вы работаете, который включает возвращаемые типы. Просто щелкните правой кнопкой мыши любой объект или метод и выберите «Перейти к определению». Надеюсь, в используемой вами версии Visual Studio это есть, если нет, подумайте об обновлении, потому что это чрезвычайно полезно.

public string getLatLang(string address) 
{ 
    string latlang = ""; 
    string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false"; 
    System.Net.WebClient client = new System.Net.WebClient(); 
    string result = client.DownloadString(url); 
    XDocument doc = System.Xml.Linq.XDocument.Parse(result); 
    XElement sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault(); 
    if (sw != null) 
    { 
        string lat = sw.Element("lat").Value;  
        string lng = sw.Element("lng").Value;  
        latlang = String.Format("{0},{1}", lat, lng); 
        // do stuff 
    } 
    return latlang; 
} 

Изменить: обратите внимание, что это решение не будет работать в .NET 2.0 без некоторых хаков из-за LINQ и перераспределения System.Core противоречит лицензионному соглашению, поэтому вам, вероятно, придется изменить XDocument на XmlDocument и выяснить, как интегрировать его с Google возвращаемое значение. Я считаю, что у него есть метод Load или метод LoadXml, не могу вспомнить, какой из них что делает.

person Chris Gessler    schedule 11.08.2012

Сам по себе var не является типом данных, он просто берет тип данных с другой стороны оператора равенства. подробнее об этом здесь

поэтому замена каждой переменной на строку не поможет, вам придется использовать правильный тип данных вместо var, если вы не можете использовать var.
ошибка в вашем случае возникает потому, что вы, я думаю, в этой строке string doc = System.Xml.Linq.XDocument.Parse(result).ToString(); при замене var вы должны иметь использовали XDocument, но вместо этого использовали string для исправления ошибок использовалась функция ToString().
Изменить: - после комментария

public string getLatLang(string address)
{
    string latlang = "";
    string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false";
    System.Net.WebClient client = new System.Net.WebClient();
    string result = client.DownloadString(url);
    XDocument doc = System.Xml.Linq.XDocument.Parse(result);
    XElement sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();
    if (sw != null)
    {
        string lat = (double)sw.Element("lat").Value;
        string lng = (double)sw.Element("lng").Value;
        latlang = lat + "," + lang;
        // do stuff
    }
    return latlang;
}


person Parv Sharma    schedule 11.08.2012
comment
да, я понимаю, что это неправильный фрагмент кода, я сделал это, чтобы читатели поняли мою цель. Мне нужна помощь в возврате latlang = lat +, + lang в строковом формате. Спасибо - person sajanyamaha; 11.08.2012
comment
Я пробовал, но показывает ошибку: «System.Collections.Generic.IEnumerable‹ System.Xml.Linq.XElement ›» не содержит определения для «Elements» - person sajanyamaha; 11.08.2012

Ключевое слово var используется для неявного ввода переменных. Вы позволяете компилятору определять тип ваших переменных. Но, по секрету, после компиляции переменным по-прежнему присваиваются определенные типы.

Что вы сделали неправильно, так это позвонили .ToString() на свой XDocument. Теперь у вас есть только одна большая строка, и вы пытаетесь относиться к ней, как к XDocument.

Попробуйте вместо этого.

XDocument doc = System.Xml.Linq.XDocument.Parse(result);
XElement = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();

Изменить

Наконец оказался перед компьютером с Visual Studio. У вас есть еще несколько проблем.

Следующее будет компилироваться в .NET 3.5+.

public string getLatLang(string address)
{
    string latlang = "";    
    string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false";
    System.Net.WebClient client = new System.Net.WebClient();
    string result = client.DownloadString(url);
    XDocument doc = System.Xml.Linq.XDocument.Parse(result);
    XElement sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();

    if (sw != null)
    {
        string lat = sw.Element("lat").ToString();
        string lng = sw.Element("lng").ToString();
        latlang = lat + "," + lng;
        // do stuff
    }
    return latlang;
}

(Обратите внимание, что позже вы явно приводили значения к double и по-прежнему определяли их типы как string).

Что касается ошибки, которую вы упомянули в своем комментарии, я не уверен ... член Elements<T>(IEnumerable<T>, XName) включен в класс расширений System.Xml.Linq (MSDN), поэтому он должен работать. Убедитесь, что вы также включили директиву System.Linq с другими директивами using:

using System.Linq;

Кстати, я вообще-то не понимаю, как большая часть написанного вами кода будет работать в .NET 2.0. Пространства имен System.Xml.Linq и System.Linq не были представлены до .NET 3.5. Если вы действительно используете .NET 2.0, вы можете сослаться на эту ветку для временного решения используемой вами версии фреймворка.

person Jeremy Wiggins    schedule 11.08.2012
comment
Я пробовал это, но ошибка: «System.Collections.Generic.IEnumerable‹ System.Xml.Linq.XElement ›» не содержит определения для «Elements» - person sajanyamaha; 11.08.2012

Хорошо, теперь я попробовал все возможное с .NET 2.0, я придумал это решение, которое, как я знаю, является кодированием очень низкого уровня, но является единственное возможное решение с 2.0, это ОТЛИЧНО работает для .NET 2.0 !!

public string getLatLang(string address)
{
    string latlang = "";
    string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false";
    System.Net.WebClient client = new System.Net.WebClient();
    string result = client.DownloadString(url);

    int firstlat = result.IndexOf("<lat>");
    int lastlat = result.IndexOf("</lat>");

    int firstlng = result.IndexOf("<lng>");
    int lastlng = result.IndexOf("</lng>");

    string _latitude = result.Substring(firstlat+5, (lastlat-5) - firstlat);
    string _longitude = result.Substring(firstlng+5, (lastlng-5) - firstlng);

    latlang = _latitude + "," + _longitude;
    return latlang;
}
person sajanyamaha    schedule 11.08.2012