2016-01-12 1 views
0

J'essaie d'écrire un code C# par lequel je veux obtenir une image de l'API Web et le titre de l'image de l'API. J'ai implémenté une méthode nommée GetImage et essaye de retourner deux résultats (image et titre). Cependant j'ai écrit un code mais comme je suis nouveau dans cette situation, je ne sais pas quoi faire dans ce cas.Obtenir deux résultats d'une autre méthode dans la classe d'application principale en utilisant C#

Ma classe de service d'image qui contiennent les méthodes est-

public class ImageService 
{ 
    public string GetImage(string name) 
    {     
     string result1; 
     string result2; 

     using (WebClient client = new WebClient()) 
     { 
      var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name; 
      string requestUrl = string.Format(uri, name); 
      var response = client.DownloadString(new Uri(uri)); 
      var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response); 
      var firstKey = responseJson.query.pages.First().Key; 
      result1 = responseJson.query.pages[firstKey].thumbnail.source; 
      result2 = responseJson.query.pages[firstKey].title; 

      var hash = uri.GetHashCode(); 

     } 
     return result1,result2; //showing error 
    } 
} 

Maintenant, les Form1.cs où je veux montrer des résultats dans picturebox et l'étiquette est-

public partial class Form1 : Form 
{ 
    private readonly ImageService _imageService; 
    public Form1() 
    {    
     _imageService = new ImageService(); 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
     pictureBox1.LoadAsync(_imageService.GetImage(textBox1.Text)); 
     label1.Text = _imageService.GetImage(textBox1.Text);// not working 
    } 
} 
+0

Pourquoi ne pas ajouter 2 propriétés représentant ce que vous voulez dans la classe ImageService? – EagerToLearn

Répondre

3

Le meilleur La méthode consiste à créer une nouvelle classe contenant les détails dont vous avez besoin et à renvoyer cette information. De cette façon, si vous avez besoin d'ajouter plus d'informations, vous pouvez simplement l'ajouter à la classe.

Par exemple:

public class ImageInfo 
{ 
    public string Title { get; set; } 
    public string Image { get; set; } 
} 

Ensuite, votre méthode retourne la classe:

public ImageInfo GetImage(string name) 
{     
    ImageInfo info = new ImageInfo(); 

    using (WebClient client = new WebClient()) 
    { 
     var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name; 
     string requestUrl = string.Format(uri, name); 
     var response = client.DownloadString(new Uri(uri)); 
     var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response); 
     var firstKey = responseJson.query.pages.First().Key; 
     info.Image = responseJson.query.pages[firstKey].thumbnail.source; 
     info.Title = responseJson.query.pages[firstKey].title; 

     var hash = uri.GetHashCode(); 

    } 
    return info; 
} 
+0

Merci beaucoup. ça fonctionne parfaitement. – Nowshin

1

Comme une méthode peut avoir une seule valeur de retour, vous pouvez utiliser le paramètre out pour renvoyer une valeur supplémentaire.

public string GetImage(string name, out string title) 
{ 
    string result1; 

    using (WebClient client = new WebClient()) 
    { 
     var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name; 
     string requestUrl = string.Format(uri, name); 
     var response = client.DownloadString(new Uri(uri)); 
     var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response); 
     var firstKey = responseJson.query.pages.First().Key; 
     result1 = responseJson.query.pages[firstKey].thumbnail.source; 
     title = responseJson.query.pages[firstKey].title; 

     var hash = uri.GetHashCode(); 
    } 
    return result1; 
} 

Utilisation;

private void button1_Click(object sender, EventArgs e) 
{ 
    string title = string.Empty; 

    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
    pictureBox1.LoadAsync(_imageService.GetImage(textBox1.Text, out title)); 
    label1.Text = title; 
} 
3

Vous ne pouvez renvoyer qu'une valeur à partir d'une fonction. Donc, pour lutter contre cela, vous avez 2 options:

  • Utilisez le paramètre out d'une fonction
  • Retour un objet personnalisé qui a 2 propriétés

solution d'objet personnalisée:

public class ImageResult 
{ 
    string ImageUrl { get; set; } 
    string Title { get; set; } 
} 

public ImageResult GetImage(string imageTitle) 
{     
    ImageResult result = new ImageResult(); 

    using (WebClient client = new WebClient()) 
    { 
     var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+imageTitle; 
     string requestUrl = string.Format(uri, imageTitle); 
     var response = client.DownloadString(new Uri(uri)); 
     var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response); 
     var firstKey = responseJson.query.pages.First().Key; 

     result.ImageUrl = responseJson.query.pages[firstKey].thumbnail.source; 
     result.Title = responseJson.query.pages[firstKey].title; 

     var hash = uri.GetHashCode(); 

    } 
    return result; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 

    var imageResult = _imageService.GetImage(textBox1.Text); 

    pictureBox1.LoadAsync(imageResult.ImageUrl); 
    label1.Text = imageResult.Title; 
} 
2

Vous ne pouvez pas renvoyer plusieurs valeurs d'une méthode comme celle-ci.

Modifier le profil de méthode:

private Tuple<string, string> GetImage(string name) 

et la déclaration de retour à:

return new Tuple<string, string>(result1, result2); 

Ensuite, vous pouvez tirer chaque résultat de la Tuple:

var resultTuple = _imageService.GetImage(textBox1.Text); 
label1.Text = resultTuple.Item1; 
label2.Text = resultTuple.Item2; 
1

En utilisant tuples. Exemple

using System; 

class Program 
{ 
    static void Main() 
    { 
    // Create three-item tuple. 
    Tuple<int, string, bool> tuple = 
     new Tuple<int, string, bool>(1, "cat", true); 
    // Access tuple properties. 
    if (tuple.Item1 == 1) 
    { 
     Console.WriteLine(tuple.Item1); 
    } 
    if (tuple.Item2 == "dog") 
    { 
     Console.WriteLine(tuple.Item2); 
    } 
    if (tuple.Item3) 
    { 
     Console.WriteLine(tuple.Item3); 
    } 
    } 
} 

police http://www.dotnetperls.com/tuple

+0

Les tuples bien fonctionnent mais ils cachent ce qu'il y a dedans. Je proposerais toujours des objets personnalisés pour la réactivité. – RvdK

1

Vous pouvez utiliser une classe:

public class Image 
{ 
    public string Url { get; internal set; } 
    public string Title { get; internal set; } 

    public Image(string name) 
    { 
     string result1; 
     string result2; 

     using (WebClient client = new WebClient()) 
     { 
      var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name; 
      string requestUrl = string.Format(uri, name); 
      var response = client.DownloadString(new Uri(uri)); 
      var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response); 
      var firstKey = responseJson.query.pages.First().Key; 
      result1 = responseJson.query.pages[firstKey].thumbnail.source; 
      result2 = responseJson.query.pages[firstKey].title; 

      var hash = uri.GetHashCode(); 

     } 
     Url = result1; 
     Title = result2; 
    } 
} 

Et l'utiliser comme ceci:

private void button1_Click(object sender, EventArgs e) 
{ 
    var img = _imageService.GetImage(textBox1.Text); 

    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
    pictureBox1.LoadAsync(img.Url); 
    label1.Text = img.Title; 
} 
2

Il y a plusieurs options à choisir .

Vous pouvez revenir Dictionnaire comme ceci:

 public Dictionary<string, string> GetImage(string name) 
     { 
      string result1; 
      string result2; 

      using (WebClient client = new WebClient()) 
      { 
        var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name; 
        string requestUrl = string.Format(uri, name); 
        var response = client.DownloadString(new Uri(uri)); 
        var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response); 
        var firstKey = responseJson.query.pages.First().Key; 
        result1 = responseJson.query.pages[firstKey].thumbnail.source; 
        result2 = responseJson.query.pages[firstKey].title; 

        var hash = uri.GetHashCode(); 

      } 
      Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
      dictionary.Add("Source", result1); 
      dictionary.Add("Title", result2); 
      return dictionary; 
     } 

Ensuite, vous pouvez consommer le dictionnaire comme celui-ci:

private void button1_Click(object sender, EventArgs e) 
    { 
     pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
     Dictionary<string, string> imageDictionary = _imageService.GetImage(textBox1.Text); 
     pictureBox1.LoadAsync(imageDictionary["Source"]); 
     label1.Text = imageDictionary["Title"]; 
    } 

Vous pouvez également revenir Liste, ou utiliser des paramètres, ou comme l'a noté d'autres réponses vous pouvez créer une classe personnalisée et la renvoyer.

+0

, Merci pour votre réponse.Bit pendant que j'écris votre code, il montre une erreur. dans form1.cs il est dit que le nom 'GetImage' n'existe pas dans le contexte actuel – Nowshin

+0

Merci @nick, j'ai mis à jour la réponse. Ce devrait être _imageService.GetImage – foobar

0

Anonymously:

dynamic Get() 
{ 
    return new {Url = "url", Image = "image"}; 
} 

var result = Get(); 

var url = (string) result.Url; 

Bien que, ce qui est généralement mieux adapté à LINQ.