인스턴스 참조를 사용하여 멤버 "에 액세스할 수 없습니다.
저는 C#에 가입하고 있으며 다음과 같은 문제가 있습니다.
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;
}
}
}
}
사용자 컨트롤에 다음 코드가 있습니다.
using MyDataLayer.Section1;
public class MyClass
{
protected void MyMethod
{
MyClass.MyItem oItem = new MyClass.MyItem();
oItem = MyClass.GetItem();
someLiteral.Text = oItem.Property1;
}
}
를 제외하고는 모든 것이 잘 작동합니다.Property1
그 지성은 나에게 "만능을 줍니다.Equals
,GetHashCode
,GetType
,그리고.ToString
옵션으로마우스를 위에 놓으면oItem.Property1
Visual Studio는 다음과 같은 설명을 제공합니다.
Member
내 데이터 계층.◦1. 반내 항목 가져오기.속성1.getcannot be accessed with an instance reference, qualify it with a type name instead
저는 이것이 무엇을 의미하는지 잘 모르겠습니다. 저는 구글링을 좀 했지만 이해할 수 없었습니다.
C#에서는 VB와 달리. 자바에 할 수 .static
인스턴스 구문을 가진 멤버입니다.다음 작업을 수행해야 합니다.
MyClass.MyItem.Property1
해당 속성을 참조하거나 제거합니다.static
의수어의 .Property1
(이것이 아마도 당신이 하고 싶은 일일 것입니다.)무엇인지에 대한 개념적인 아이디어는 제 다른 답변을 참조하십시오.
형식 이름을 사용하여 정적 멤버에만 액세스할 수 있습니다.
그러므로, 당신은 글을 쓸 필요가 있습니다.
MyClass.MyItem.Property1
또는 (아마도 이것이 당신이 해야 할 일일 것입니다)Property1
인스instance (제) 속성여하를 static
키워드를 지정할 수 있습니다.
정적 속성은 클래스의 모든 인스턴스 간에 공유되므로 하나의 값만 가질 수 있습니다.현재 정의된 방법으로는 MyItem 클래스의 인스턴스를 만드는 것이 의미가 없습니다.
저도 같은 문제가 있었습니다. 몇 년 후에는 몇 가지 조언이 도움이 될 수도 있습니다.
'static'을 무료로 사용하지 마십시오!
런타임 및 컴파일 시간 시맨틱(동작) 및 구문 측면에서 'static'이 의미하는 바를 이해합니다.
에 자동으로 됩니다.
그 최초의 용도. 즉, .
해당 엔티티에 액세스하는 모든 사용자가 공유합니다.이름을 수 , 이름을 통해서만 액세스할 수 있습니다.
그런 유형의 예를 통해.. ( method는 실행량이 . 'this'와 같습니다.)
오버헤드 – 이를 사용해야 하는 이유 중 하나입니다.)정적 엔티티를 사용할 때 스레드 안전에 대해 생각합니다.
MSDN의 정적에 대한 몇 가지 세부 정보:
이로 인해 다음 오류가 발생합니다.
MyClass aCoolObj = new MyClass();
aCoolObj.MyCoolStaticMethod();
해결책은 다음과 같습니다.
MyClass.MyCoolStaticMethod();
설명:
개체의 인스턴스에서 정적 메서드를 호출할 수 없습니다.정적 메서드의 요점은 개체의 인스턴스에 연결되지 않고 해당 개체의 모든 인스턴스를 통해 유지하거나 개체의 인스턴스 없이 사용하는 것입니다.
이 경우 충분히 설명한 대로 정적을 사용할 필요가 없습니다.당신은 당신의 재산을 초기화하는 것이 좋을 것입니다.GetItem()
의 두 예: 법두, 아래가예지:
namespace MyNamespace
{
using System;
public class MyType
{
public string MyProperty { get; set; } = new string();
public static string MyStatic { get; set; } = "I'm static";
}
}
소비:
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;
}
}
인스턴스 참조로 액세스할 수 없습니다.
STATIC 메서드를 호출하여 인스턴스를 전달한다는 의미입니다.가장 쉬운 해결책은 정적을 제거하는 것입니다. 예:
public static void Excel로 내보내기(IEnumberable data, string sheetName) {
호출하려는 함수의 정적을 제거합니다.이것으로 저는 그 문제를 해결했습니다.
정적 멤버 인스턴스 참조 문제(중복)를 통해 C# 컴파일러 오류 CS0176에 대한 구글링을 하게 되었습니다.
저의 경우, 같은 이름의 정적 메서드와 확장 메서드가 있어서 오류가 발생했습니다.자세한 내용은 동일한 이름의 정적 메서드 및 확장 메서드를 참조하십시오.
[아마도 이것은 논평이었어야 했을 것입니다.아직 평판이 좋지 않아서 죄송합니다.]
이것이 오래된 스레드라는 것을 알지만, 저는 제 문제가 무엇인지 알아내려고 3시간을 보냈습니다.저는 보통 이 오류가 무엇을 의미하는지 알고 있지만, 더 미묘한 방식으로 이 오류에 부딪힐 수도 있습니다.문제는 클라이언트 클래스(인스턴스 클래스에서 정적 메서드를 호출하는 클래스)가 다른 유형의 속성을 가지고 있지만 정적 메서드와 이름이 같다는 것입니다.컴파일러가 보고한 오류는 여기서 보고한 오류와 동일하지만 기본적으로 이름 충돌이 문제였습니다.
이 오류가 발생하는 다른 사용자의 경우, 위에서 설명한 어떤 도움도 되지 않습니다. 컴파일러가 의미하는 정확한 이름을 볼 수 있도록 네임스페이스 이름으로 인스턴스 클래스를 완전히 한정해 보십시오.
코드에 가장 오른쪽 부분이 정적 클래스 이름과 일치하는 네임스페이스가 포함되어 있는지 확인합니다.
네임스페이스 Foo에 정의된 정적 Bar 클래스에서 메서드 Jump 또는 속성을 구현하면 Bar로 끝나는 다른 네임스페이스도 있으므로 컴파일러 오류가 발생할 가능성이 있습니다.네, 생선 요리;-)
그렇다면 사용 중인 막대 및 막대를 의미합니다.Jump() 호출. 따라서 다음 솔루션 중 하나가 사용자의 요구에 적합해야 합니다.
- 정적 클래스 이름을 해당 네임스페이스로 완전 수식하여 Foo를 생성합니다.Bar.Jump() 선언입니다.또한 막대 사용; 문을 제거해야 합니다.
- 네임스페이스 표시줄의 이름을 다른 이름으로 바꿉니다.
이 경우 데이터베이스의 EF(Entity Framework) 저장소 프로젝트에서 fullow 컴파일러 오류가 발생했습니다.SetInitializer() 호출:
Member 'Database.SetInitializer<MyDatabaseContext>(IDatabaseInitializer<MyDatabaseContext>)' cannot be accessed with an instance reference; qualify it with a type name instead MyProject.ORM
내 프로젝트를 추가할 때 이 오류가 발생합니다.ORM.데이터베이스 네임스페이스는 데이터베이스와 일치합니다.Initializer 클래스 이름을 설정합니다.
따라서 EF의 Database static 클래스를 제어할 수 없고 사용자 지정 네임스페이스도 보존하고 싶기 때문에 EF의 Database static 클래스를 네임스페이스 System으로 완전히 한정하기로 결정했습니다.Data.Entity - 다음 명령을 사용하여 컴파일에 성공했습니다.
System.Data.Entity.Database.SetInitializer<MyDatabaseContext>(MyMigrationStrategy)
도움이 되길 바랍니다.
YourClassName.YourStaticFieldName
정적 필드는 다음과 같습니다.
public class StaticExample
{
public static double Pi = 3.14;
}
다른 클래스에서 다음과 같이 staic 필드에 액세스할 수 있습니다.
class Program
{
static void Main(string[] args)
{
double radius = 6;
double areaOfCircle = 0;
areaOfCircle = StaticExample.Pi * radius * radius;
Console.WriteLine("Area = "+areaOfCircle);
Console.ReadKey();
}
}
언급URL : https://stackoverflow.com/questions/1100009/member-member-name-cannot-be-accessed-with-an-instance-reference
'programing' 카테고리의 다른 글
postgresql을 처음으로 구성하는 방법은 무엇입니까? (0) | 2023.05.08 |
---|---|
Git와 GitHub의 차이점 (0) | 2023.05.08 |
프로그래머는 SSIS를 사용해야 하며, 그렇다면 그 이유는 무엇입니까? (0) | 2023.05.08 |
WCF - 메시지 크기 할당량을 늘리는 방법 (0) | 2023.05.08 |
모든 테이블(PostgreSQL)에서 특정 값을 검색하는 방법은 무엇입니까? (0) | 2023.05.08 |