2010-02-05 15 views
5

tengo la siguiente función estática en C#Cómo asignar un valor a partir de un método estático C# para una etiqueta

public static string Greet(string name) 
    { 
     string greeting = "welcome "; 

     // is it possible to pass this value to a label outside this static method? 
     string concat = string.Concat(greeting, name); 

     //error 
     Label1.text = concat; 

     //I want to return only the name 
     return name; 
    } 

Como se puede ver en los comentarios, quiero retener sólo el nombre que el valor de retorno , sin embargo, quiero poder sacar el valor de la variable concat para asignarlo a una etiqueta, pero cuando intento el compilador se niega, ¿se puede hacer? Hay un trabajo alrededor?

Gracias.

+0

¿Por qué hiciste la función estática? La solución obvia es hacerlo no estático. – Foole

+0

Sin mencionar que parece extraño devolver el parámetro en este caso. –

+1

Es estático porque está decorado como [WebMethod], luego se invoca con Ajax, el valor de retorno se pasa a Ajax, aún necesito usar la variable concat en el código. - Gracias – tika

Respuesta

4

Si el método debe ser estática, por alguna razón, el enfoque principal aquí sería pasar cualquier estado requerido en el método - es decir, añadir un parámetro para el método que es o bien la etiqueta o (mejor) algunos envoltorio escrita a máquina con una propiedad configurable como .Greeting:

public static string Greet(string name, YourType whatever) 
{ 
    string greeting = "welcome "; 

    whatever.Greeting = string.Concat(greeting, name); 

    return name; 
} 

(donde YourType podría ser su control, o podría ser una interfaz que permite la reutilización)

Lo que no desea hacer es utilizar estado estático o eventos - muy fácil de obtener pérdidas de memoria, etc. de esa manera.


Por ejemplo:

public static string Greet(string name, IGreetable whatever) 
{ 
    string greeting = "welcome "; 

    whatever.Greeting = string.Concat(greeting, name); 

    return name; 
} 
public interface IGreetable { 
    string Greeting {get;set;} 
} 
public class MyForm : Form, IGreetable { 
    // snip some designer code 

    public string Greeting { 
     get { return helloLabel.Text;} 
     set { helloLabel.Text = value;} 
    } 

    public void SayHello() { 
     Greet("Fred", this); 
    } 
} 
+0

Gracias Marc, eso realmente tiene sentido. Lo estoy probando. :) – tika

+0

Hola Marc, gracias. Ok, hago un contenedor y puedo asignarle el valor: clase pública MyType { cadena privada x; cadena pública Saludo { get {return x; } conjunto {x = valor; }} } Sin embargo sigo teniendo dificultades para encontrar la manera de asignar la propiedad envoltorio de la etiqueta de la derecha después del método Greet ejecuta. gracias de antemano. – tika

+0

Muchas gracias Marc, ¡funciona! Doy la bienvenida a tu respuesta. – tika

4

O no estático:

public string Greet(string name) 
{ 
    const string greeting = "welcome "; 
    string concat = string.Concat(greeting, name); 
    Label1.Text = concat; 
    return name; 
} 

O todavía estática pasar el sello como Greet("John", Label1):

public static string Greet(string name, Label label) 
{ 
    const string greeting = "welcome "; 
    string concat = string.Concat(greeting, name); 
    label.Text = concat; 
    return name; 
} 

Pero no estoy seguro de por qué es necesario para devolver el nombre en cualquiera de los casos ... si Lo tenía cuando llamaba a la función, ya la tiene en el ámbito al que volvería. Ejemplo:

var name = "John"; 
Greet(name); 
//can still call name here directly 
+0

gracias Nick, ese es solo un ejemplo simplificado con solo el nombre. La razón por la cual es estático es porque está decorado con el atributo [WebMethod]. Sin embargo, no sé si hay una forma de acceder a un método de página desde Ajax sin declararlo como estático. – tika

+0

@tika - Ah, en ese caso, sí, tiene que ser estático. –

+0

Hola Nick, pruebo este ejemplo pero el compilador se queja de que ystem.Web.UI.WebControls.Label 'no contiene una definición para' texto '. Lo siento, soy un novato, solo estoy aprendiendo. – tika

0

El problema es que intenta crear una instancia de una variable de clase de método estático.

0

Tal vez estoy perdiendo el punto, pero no pudiste hacer:

public static string Greet(string name) 
{ 
    return string.Concat("Welcome ", name); 
} 

luego usarlo como: métodos

string name = "John"; 
label1.Text = Greet(name); 

web no tienen que ser estática.

+1

Hola Nismoto, tienes razón, pero este es un escenario diferente, quería poder obtener información sin usar el valor de retorno, el valor de retorno ya se usa. He intentado llamar a los métodos de página en ASP.NET 3.5 con Ajax y no requieren ser estáticos, sin embargo, en .NET 2.0 simplemente no funcionan a menos que se declaren como estáticos. pero supongo que esa será otra pregunta por separado. – tika

Cuestiones relacionadas