[C#] 인스턴스 참조로 멤버 ‘<method>’에 액세스 할 수 없습니다.

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;
            }
        }
     }
 }

이 코드는 UserControl에 있습니다.

using MyDataLayer.Section1;

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

내가 접근 할 때를 제외하고는 모든 것이 잘 작동합니다 Property1. IntelliSense를 만 나 “제공 Equals, GetHashCode, GetType, 및 ToString“옵션으로. 에 마우스를 oItem.Property1올리면 Visual Studio에서 다음과 같은 설명을 제공합니다.

MemberMyDataLayer.Section1.MyClass.MyItem.Property1.getcannot be accessed with an instance reference, qualify it with a type name instead

이것이 무엇을 의미하는지 잘 모르겠습니다. 인터넷 검색을 수행했지만 알아낼 수 없었습니다.



답변

C #에서는 VB.NET 및 Java와 달리 static인스턴스 구문으로 멤버에 액세스 할 수 없습니다 . 해야 할 일 :

MyClass.MyItem.Property1

해당 속성을 참조하거나 static수정자를 제거하십시오 Property1(아마도 원하는 작업입니다). 무엇이 무엇인지에 대한 개념적인 아이디어는 static다른 답변을 참조하십시오 .


답변

유형 이름을 사용하여 정적 멤버에만 액세스 할 수 있습니다.

그러므로 다음 중 하나를 작성해야합니다.

MyClass.MyItem.Property1

또는 정의 Property1에서 static키워드를 제거하여 인스턴스 속성을 만드십시오 .

정적 속성은 클래스의 모든 인스턴스간에 공유되므로 하나의 값만 갖습니다. 지금 정의한대로 MyItem 클래스의 인스턴스를 만들 필요는 없습니다.


답변

나는 같은 문제가 있었지만 몇 년 후에도 일부 포인터가 도움이 될 수 있습니다.

‘정적’을 과도하게 사용하지 마십시오!

런타임 및 컴파일 시간 의미론 (동작) 및 구문 모두에서 ‘정적’이 의미하는 바를 이해하십시오.

  • 정적 엔티티는
    처음 사용 하기 얼마 전에 자동으로 생성됩니다 .

  • 정적 엔터티에는 하나의 저장소 위치가 할당되며
    해당 엔터티에 액세스하는 모든 사람 이 공유합니다.

  • 정적 엔티티는 해당 유형
    의 인스턴스가 아닌 유형 이름을 통해서만 액세스 할 수 있습니다 .

  • 정적 메소드에는 인스턴스 메소드와 마찬가지로 암시적인 ‘this’인수가 없습니다. (따라서 정적 메소드는 실행
    오버 헤드 가 적습니다 .이를 사용하는 이유 중 하나입니다.)

  • 정적 엔터티를 사용할 때 스레드 안전성을 고려하십시오.

MSDN의 정적에 대한 세부 정보 :


답변

이 경우 철저하게 설명 된대로 정적을 사용할 필요가 없습니다. 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 메소드를 호출하고 인스턴스를 전달한다는 것을 의미합니다. 가장 쉬운 해결책은 정적을 제거하는 것입니다. 예 :

공개 정적 무효 ExportToExcel (IEnumerable 데이터, 문자열 sheetName) {


답변

나는 이것이 오래된 스레드라는 것을 알고 있지만, 단지 3 시간 동안 내 문제가 무엇인지 알아 내려고 노력했습니다. 나는 일반적 으로이 오류의 의미를 알고 있지만 더 미묘한 방법 으로이 문제를 해결할 수 있습니다. 내 문제는 내 클라이언트 클래스 (인스턴스 클래스에서 정적 메서드를 호출하는 클래스)가 다른 유형의 속성을 가지고 있지만 정적 메서드와 동일한 이름을 가졌습니다. 컴파일러가보고 한 오류는 여기보고 된 것과 동일하지만 문제는 기본적으로 이름 충돌이었습니다.

다른 사람 이이 오류를 겪고 위의 어느 것도 도움이되지 않으면 네임 스페이스 이름으로 인스턴스 클래스를 정규화하십시오. .. () 그래서 컴파일러는 당신이 의미하는 정확한 이름을 볼 수 있습니다.


답변

코드에 네임 스페이스가 포함되어 있는지 확인하십시오. 대부분 네임 스페이스가 정적 클래스 이름과 일치합니다.

정적을 감안할 네임 스페이스에 정의 된 클래스, , 메소드 구현 점프 또는 속성을 가능성도에 끝나는 다른 네임 스페이스가 있기 때문에 당신이 컴파일러 오류를 받고 있습니다 . 네, 비린내 물건 😉

그렇다면 사용 바를 사용한다는 의미입니다 . 그리고 Bar.Jump () 다음과 같은 솔루션, 따라서 하나의 호출은, 필요에 맞게해야한다 :

  • 네임 스페이스에 따라 정적 클래스 이름을 완전히 규정하면 Foo.Bar.Jump () 선언이 발생합니다. Using Bar 도 제거해야합니다 . 성명서
  • 네임 스페이스 바의 이름을 다른 이름으로 바꿉니다 .

필자의 경우 다음 컴파일러 오류 는 Database.SetInitializer () 호출 의 EF ( Entity Framework ) 리포지토리 프로젝트에서 발생했습니다 .

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

MyProject.ORM을 추가하면이 오류가 발생 합니다. 수 있듯이 접미사 ( Database ) 인 데이터베이스 네임 스페이스 는 Database .SetInitializer 클래스 이름 과 일치 합니다.

여기서는 EF의 데이터베이스 정적 클래스 에 대한 제어 권한이 없으며 사용자 정의 네임 스페이스를 유지하고 싶기 때문에 EF의 데이터베이스 정적 클래스를 namepace System.Data.Entity 로 완전히 규정하기로 결정 했으며 다음 명령을 사용했습니다. 컴파일 성공 :

System.Data.Entity.Database.SetInitializer<MyDatabaseContext>(MyMigrationStrategy)

그것이 도움이되기를 바랍니다.