El miembro ” no se puede acceder con una referencia de instancia

Me estoy metiendo en C # y estoy teniendo este problema:

namespace MyDataLayer { namespace Section1 { public class MyClass { public class MyItem { public static string Property1{ get; set; } } public static MyItem GetItem() { MyItem theItem = new MyItem(); theItem.Property1 = "MyValue"; return theItem; } } } } 

Tengo este código en un UserControl:

 using MyDataLayer.Section1; public class MyClass { protected void MyMethod { MyClass.MyItem oItem = new MyClass.MyItem(); oItem = MyClass.GetItem(); someLiteral.Text = oItem.Property1; } } 

Todo funciona bien, excepto cuando voy a acceder a Property1 . El intellisense solo me da ” Equals , GetHashCode , GetType y ToString ” como opciones. Cuando paso el mouse sobre oItem.Property1 , Visual Studio me da esta explicación:

No cannot be accessed with an instance reference, qualify it with a type name instead Member MyDataLayer.Section1.MyClass.MyItem.Property1.get cannot be accessed with an instance reference, qualify it with a type name instead califíquelo cannot be accessed with an instance reference, qualify it with a type name instead

No estoy seguro de lo que esto significa, hice algunas búsquedas en Google pero no fui capaz de resolverlo.

En C #, a diferencia de VB.NET y Java, no puede acceder a miembros static con syntax de instancia. Deberías hacer:

 MyClass.MyItem.Property1 

para referirse a esa propiedad o eliminar el modificador static de la Property1 (que es lo que probablemente quiera hacer). Para una idea conceptual sobre lo que es la static , vea mi otra respuesta .

Solo puede acceder a miembros estáticos usando el nombre del tipo.

Por lo tanto, necesitas escribir,

 MyClass.MyItem.Property1 

O bien (esto es probablemente lo que debe hacer) convertir Property1 una propiedad de instancia al eliminar la palabra clave static de su definición.

Las propiedades estáticas se comparten entre todas las instancias de su clase, de modo que solo tienen un valor. Tal como se define ahora, no tiene sentido crear instancias de su clase MyItem.

Tuve el mismo problema, aunque algunos años más tarde, algunos pueden encontrar útiles algunos consejos:

¡No use ‘estático’ gratuitamente!

Comprender qué implica “estática” en términos de semántica de tiempo de ejecución y comstackción (comportamiento) y syntax.

  • Una entidad estática se construirá automáticamente algún tiempo antes
    su primer uso.

  • Una entidad estática tiene asignada una ubicación de almacenamiento, y eso es
    compartido por todos los que acceden a esa entidad.

  • Solo se puede acceder a una entidad estática mediante su nombre de tipo, no
    a través de una instancia de ese tipo.

  • Un método estático no tiene un argumento ‘this’ implícito, como lo hace un método de instancia. (Y, por lo tanto, un método estático tiene menos ejecución
    sobrecarga – una razón para usarlos.)

  • Piense en la seguridad de subprocesos al usar entidades estáticas.

Algunos detalles sobre estática en MSDN:

  • Clases estáticas en C #
  • Constructores estáticos en C #

No es necesario usar estática en este caso como se explica detalladamente. También podría inicializar su propiedad sin el método GetItem() , ejemplo de ambos a continuación:

 namespace MyNamespace { using System; public class MyType { public string MyProperty { get; set; } = new string(); public static string MyStatic { get; set; } = "I'm static"; } } 

Consumidor:

 using MyType; public class Somewhere { public void Consuming(){ // through instance of your type var myObject = new MyType(); var alpha = myObject.MyProperty; // through your type var beta = MyType.MyStatic; } } 

no se puede acceder con una referencia de instancia

Significa que llamas a un método STATIC y le pasas una instancia. La solución más fácil es eliminar estática, por ejemplo:

vacío público estático ExportToExcel (datos de IEnumerable, string sheetName) {

Compruebe si su código contiene un espacio de nombres que la parte más a la derecha coincide con su nombre de clase estático.

Dada la clase de Bar estática, definida en el espacio de nombres Foo , implementando un método Jump o una propiedad, es probable que esté recibiendo un error de comstackción porque también hay otro espacio de nombres que termina en Bar . Sí, fishi cosas 😉

Si eso es así, significa que estás usando una barra de uso; y una llamada Bar.Jump () , por lo tanto, una de las siguientes soluciones debería satisfacer sus necesidades:

  • Califica completamente el nombre de la clase estática con el espacio de nombre correspondiente, que resulta en la statement Foo.Bar.Jump () . También necesitarás eliminar Using Bar; statement
  • Cambie el nombre de la barra de espacio de nombres por un nombre diferente.

En mi caso, el siguiente error del comstackdor ocurrió en un proyecto de repository EF ( Entity Framework ) en una llamada a Database.SetInitializer () :

 Member 'Database.SetInitializer(IDatabaseInitializer)' cannot be accessed with an instance reference; qualify it with a type name instead MyProject.ORM 

Este error se produjo cuando agregué un MyProject.ORM. Espacio de nombres de la base de datos , que sufijo ( Base de datos ), como habrán notado, coincide con el nombre de la clase Database .SetInitializer .

En esto, dado que no tengo control en la clase estática de la base de datos de EF y también me gustaría conservar mi espacio de nombres personalizado, decidí calificar completamente la clase estática de la base de datos de EF con su espacio de nombre System.Data.Entity , que resultó en el uso del siguiente comando, que comstackción exitosa:

 System.Data.Entity.Database.SetInitializer(MyMigrationStrategy) 

Espero eso ayude

Llegué aquí buscando el error CS0176 del comstackdor de C #, a través de una pregunta (duplicada) Problema de referencia de instancia de miembro estático .

En mi caso, el error ocurrió porque tenía un método estático y un método de extensión con el mismo nombre. Para eso, vea Método estático y método de extensión con el mismo nombre .

[Puede ser que esto debería haber sido un comentario. Lo siento, todavía no tengo suficiente reputación.]

Sé que este es un hilo viejo, pero solo pasé 3 horas tratando de descubrir cuál era mi problema. Normalmente sé lo que significa este error, pero también puedes toparte con esto de una manera más sutil. Mi problema era que mi clase de cliente (la que llamaba a un método estático de una clase de instancia) tenía una propiedad de un tipo diferente pero con el mismo nombre que el método estático. El error informado por el comstackdor fue el mismo que se informó aquí, pero el problema fue básicamente la colisión de nombres.

Si alguien más obtiene este error y ninguno de los anteriores le ayuda, intente calificar completamente su clase de instancia con el nombre del espacio de nombres. .. () para que el comstackdor pueda ver el nombre exacto que quieres decir.