c# - solucion - El miembro ''<method>'' no se puede acceder con una referencia de instancia
se requiere una referencia de objeto para el campo método o propiedad no estáticos c# (8)
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) {
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.getcannot be accessed with an instance reference, qualify it with a type name instead
califíquelocannot 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.
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 compilació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 declaración Foo.Bar.Jump () . También necesitarás eliminar Using Bar; declaración
- Cambie el nombre de la barra de espacio de nombres por un nombre diferente.
En mi caso, el siguiente error del compilador ocurrió en un proyecto de repositorio EF ( Entity Framework ) en una llamada a Database.SetInitializer () :
Member ''Database.SetInitializer<MyDatabaseContext>(IDatabaseInitializer<MyDatabaseContext>)'' 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 compilación exitosa:
System.Data.Entity.Database.SetInitializer<MyDatabaseContext>(MyMigrationStrategy)
Espero eso ayude
En C #, a diferencia de VB.NET y Java, no puede acceder a miembros static
con sintaxis 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 .
Llegué aquí buscando el error CS0176 del compilador 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.]
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;
}
}
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 compilador 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 compilador pueda ver el nombre exacto que quieres decir.
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 compilación (comportamiento) y sintaxis.
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: