Member 12285600 Ответов: 3

Для нестатического метода требуется объект


Я знаю, что это часто задаваемый вопрос, и я пытался следовать другим ответам, чтобы заставить мой код работать, но мне не повезло. Я создал экземпляр класса (ну, я думал, что у меня есть), но я все еще получаю ошибку "объект требуется для нестатического метода"

Что я уже пробовал:

namespace Website.Forms
{
    public partial class AddDDPayment : PageBase<Add_DDPayment_Controller>
    {

        public PageMode Mode = PageMode.Add;

        public TextBox SortCode => tb_strsortcode;
        public TextBox Person => tb_nameonaccount;
        public TextBox BACSReference => tb_bacsreference;
        public TextBox AccountNumber => tb_straccountnumber;
        public TextBox BankName => tb_bankname;
        public TextBox BankAddress1 => tb_bankaddressline1;
        public TextBox BankAddressLine2 => tb_bankaddressline2;
        public TextBox BankAddressCity => tb_bankaddresscity;
        public TextBox BankAddressCountry => tb_bankaddresscountry;
        public TextBox BankAddressPostcode => tb_bankaddresspostcode;
        public TextBox BillingAddress1 => tb_billingaddress1;
        public TextBox BilingAddress2 => tb_billingaddress2;
        public TextBox BillingAddress3 => tb_billingaddress3;
        public TextBox BillingPostcode => tb_billingaddresspostcode;
        public CheckBox IsOwnBank => cb_isownbankaccount;


        public Button Update => btn_Update;
        public Button Close => btn_Close;

        public Label ErrorMessage => l_error;
        public Label InfoMessage => l_info;

        public virtual string Id
        {
            get => Request.QueryString["id"];
            set => throw new NotImplementedException();
        }

        public virtual object PersonId
        {
            get => ViewState["personId"];
            set => ViewState["personId"] = value;
        }

        public virtual object GroupId
        {
            get => ViewState["groupId"];
            set => ViewState["groupId"] = value;
        }


        protected void UpdateBankAddress(object sender, EventArgs e)
        {
            string sortCode = SortCode.Text;
            string accountNum = AccountNumber.Text;

            Helper h = new Helper();
            h.NewBankAddress(sortCode, accountNum);
        }
    }

    public class Helper
    {
        public string NewBankAddress(string sortCode, string accountNum)
        {
            PostcodeAnywhereBusinessLogic.ValidateBank(sortCode, accountNum);
            return "test";
        }
    }

}

F-ES Sitecore

По какой линии?

Member 12285600

PostcodeAnywhereBusinessLogic.ValidateBank(sortCode, accountNum);

F-ES Sitecore

Это означает, что PostcodeAnywhereBusinessLogic-это имя типа, а не переменная, и вы можете вызывать методы только для типов, если они статичны, так что код будет работать только в том случае, если ValidateBank статичен. Если это не так, то вам нужно вызвать метод на экземпляре типа, а не на самом типе;

PostcodeAnywhereBusinessLogic pcaLogic = новый PostcodeAnywhereBusinessLogic();
pcaLogic.ValidateBank(sortCode, accountNum);

CPallini

В какой строке происходит ошибка?

Member 12285600

Извините, я должен был упомянуть, что получаю ошибку на линии -

PostcodeAnywhereBusinessLogic.ValidateBank(sortCode, accountNum);

dnxit

вам нужно создать объект и вызвать like

PostcodeAnywhereBusinessLogic xyz = новый PostcodeAnywhereBusinessLogic();
xyz.ValidateBank(sortCode, accountNum);

3 Ответов

Рейтинг:
28

OriginalGriff

В послании говорится, что <pre>PostcodeAnywhereBusinessLogic.ValidateBank</pre> метод нестатичен, а это значит, что ему нужен экземпляр PostcodeAnywhereBusinessLogic класс для того, чтобы быть вызванным.

Давайте на минутку задумаемся о машинах: в вашей машине есть бардачок, в который вы кладете свой мобильный телефон, а затем идете в паб. Находясь в пабе, вы можете достать свой мобильный телефон, открыв обычный перчаточный ящик на стойке бара и потянувшись туда?
Конечно, нет - вы же знаете, что для того, чтобы получить мобильный телефон, вам нужно выйти из паба, найти свою машину - не любую машину, не мою машину: это должна быть ваша машина - открыть дверь, открыть бардачок. и возьми свой телефон.

Ваш автомобиль является экземпляром "класса автомобилей", и каждый экземпляр имеет свой собственный перчаточный ящик - поэтому, когда вы хотите, чтобы ваш телефон, вы должны ссылаться на фактический экземпляр, содержащий перчаточный ящик, который вы открыли, чтобы положить свой телефон.

PostcodeAnywhereBusinessLogic.ValidateBank если то же самое: вам нужно предоставить точный экземпляр PostcodeAnywhereBusinessLogic это относится и к банку, который вы хотите проверить.

А так как у нас нет ни идеи, ни доступа к PostcodeAnywhereBusinessLogic класс, вы должны будете решить это для себя!


Рейтинг:
0

Sheepings

Я предлагаю Вам почитать дальше Инициализаторы объектов и коллекций - руководство по программированию на C# | Microsoft Docs[^] Обратите внимание, что в вашем случае ваш :

PostcodeAnywhereBusinessLogic.ValidateBank(sortCode, accountNum);
не существует в том же классе, который вы используете для выполнения вызова.

Вы можете либо сделать объект, который вы вызываете статическим, либо вам нужно будет создать экземпляр нового объекта этого объекта классов, выполнив что-то вроде :
PostcodeAnywhereBusinessLogic postcodeAnywhereBusinessLogic = new PostcodeAnywhereBusinessLogic(); 
И тогда ты сможешь позвонить
postcodeAnywhereBusinessLogic.ValidateBank(sortCode, accountNum);
Ниже приводится грубое небольшое приложение, которое я сделал для вас, чтобы протестировать, отладить и изучить, и читать дальше с этого момента необязательно. Что - то нужно отметить при создании экземпляров объектов и работе со статикой, и я буду использовать интерфейсы в качестве примера здесь.

Если класс, который нуждается в создании экземпляра, ранее имел значения, установленные для указанного объекта из его собственной области видимости или другим классом, и когда вы вызываете new для экземпляра объекта, вы создаете новый объект со всеми его определенными переменными, методами и свойствами также как new. Давай я тебе покажу. Обратите внимание, что в нашем базовом классе у нас есть :
MessageClassA a = new MessageClassA();
MessageClassB b = new MessageClassB();
Если вы их сравните, то обнаружите, что они идентичны (за исключением внутреннего текста для идентификации между каждым методом), или пока один из них не будет изменен, или не будут отправлены отдельные параметры. "a" - это новый объект, производный от MessageClassA, как и "b" для MessageClassB.

Создавая экземпляр нового типа объекта, вы будете заключать контракт с новым объектом, который вы только что создали. И так; любые вновь созданные объекты с переменными свойств, установленными на объекте "а", не оказывают никакого влияния на объект "в", поскольку это не то же самое тело экземпляра, с которым оно было определено, а совершенно новое. Например, вставьте этот код в тестовое приложение, и вы получите представление о том, что происходит. Начиная с нашего базового класса :
public class BaseClass
{
    public string XValue { get; set; } = "DefaultValue";
    public void ExecuteMe()
    {
        MessageClassA a = new MessageClassA();
        MessageClassB b = new MessageClassB();
        LogMessage logMessage = new LogMessage();
        BaseClass baseClass = new BaseClass();
        baseClass.XValue = "foo";
        logMessage.WriteMessage(a, XValue);
        logMessage.WriteMessage(b, baseClass.XValue);
    }
}
Далее мы добавим наш интерфейс, который будет говорить за нас.
public interface IMessageInterface
{
    void WriteMessage(string s);
}

Затем добавьте следующие два класса. Обратите внимание, что вы можете вставить их все один за другим. Но я все равно опубликую полный источник ниже.
public class MessageClassA : IMessageInterface
{
    public void WriteMessage(string s)
    {
        Debug.WriteLine($"Message from MessageClassA { s }");
    }
}

public class MessageClassB : IMessageInterface
{

    public void WriteMessage(string s)
    {
        Debug.WriteLine($"Message from MessageClassB { s }");
    }
}
Завершение этого небольшого проекта с помощью нашего класса регистратора сообщений :
public class LogMessage
{
    public void WriteMessage(IMessageInterface Message, string v)
    {
        Message.WriteMessage($": Variable is : {v}");
    }
}
Чтобы выполнить этот фрагмент кода, вам нужна только кнопка и вставьте ее внутрь любой кнопки, которую вы выберете. Я использую кнопку 3 :
private void Button3_Click(object sender, EventArgs e)
{
    var bc = new BaseClass();
    bc.ExecuteMe();
}

После запуска кода Вы заметите в области консоли отладчика :
Цитата:
Сообщение от MessageClassA : переменная is : DefaultValue
Сообщение от MessageClassB : переменная is : foo
Обратите внимание, что "MessageClassB" не печатает ту же переменную, что и "MessageClassA" - это потому, что они являются двумя отдельными экземплярами, и каждый из них использует любые параметры, установленные для этого объявления объекта. Если следовать аналогии OriginalGriff, то это все равно, что зайти в автосалон и купить две машины совершенно одного типа.

Кроме того, когда вы возвращаетесь домой, вы заменяете красные кожаные ковшеобразные сиденья белыми кожаными ковшеобразными сиденьями. То же самое происходит с переменными каждого объекта, где автомобили-это ваши объекты, а сиденья-только параметр автомобиля.

При изучении этого задания важно понимать разницу между инстанцированием и статикой, а также разницу между ними. Это ничего не стоит, когда работаешь со статикой. Если объект объявлен статическим, вы можете нет создайте экземпляр этого статического класса или объекта.

Использование статического объекта подобно объявлению глобального. Его легче получить и установить значения класса и его статических свойств без необходимости создания экземпляра. Использование статических классов, методов и свойств упрощает вызов кода, который может вызывать непосредственно тип объекта без необходимости создания экземпляра вообще.

Более того, эти правила в определенной степени верны, поэтому не попадайтесь на удочку, не понимая области действия модификаторов доступа. И на стороне примечания; что касается интерфейсов, то это также стоит отметить :
Цитата:
Объявление интерфейса может объявлять ноль или более членов. Членами интерфейса должны быть методы, свойства, события или индексаторы. Интерфейс не может содержать константы, поля, операторы, конструкторы экземпляров, деструкторы или типы, а также статические элементы любого типа.

Все члены интерфейса неявно имеют открытый доступ. Это ошибка времени компиляции для объявлений членов интерфейса, чтобы включить любые модификаторы. В частности, члены интерфейсов не могут быть объявлены с модификаторами abstract, public, protected, internal, private, virtual, override или static.

Если вы хотите узнать больше об интерфейсах, вы можете прочитать Интерфейсы - Руководство По Программированию На C# | Microsoft Docs[^] или задать новый вопрос на эту тему.

Я надеюсь, что это поможет вам немного лучше понять создание экземпляров и статику.

Кроме того, убедитесь, что вы понимаете объем вашего кода, читая их Модификаторы Доступа - Руководство По Программированию На C# | Microsoft Docs[^]

У меня здесь мало времени, поэтому я оставлю это здесь и надеюсь, что это поможет вам лучше понять, что делать. :)


Рейтинг:
0

Member 12285600

Спасибо вам всем!

OriginalGriff
ваше объяснение помогло мне понять разницу между статикой , нестатикой и экземплярами.
dnxit 
спасибо за ваш комментарий, я смог заставить это работать. Сначала у меня были проблемы, но потом я понял, что мне нужно создать конструктор без параметров.


Richard Deeming

Если вы хотите ответить на решение, нажмите кнопку "есть вопрос или комментарий?" нажмите кнопку под этим решением и оставьте комментарий.

Если вы хотите ответить на комментарий, нажмите кнопку "ответить" рядом с комментарием и ответом.

НЕ опубликуйте свой комментарий как "решение" вашего вопроса.