2017-01-11 2 views
0

Я действительно новичок в этом, поэтому надеюсь, что мой вопрос не глупый.C# Доступ к свойствам другого класса из текущего класса

У меня такая ситуация:

Public class ClassName 
{ 

public ClassName(){} 

public string Name {get; set;} 
public SomeOtherClass class {get; set;} 

} 

public class SomeOtherClass() 
{ 
public int StatusId {get; set;} 
public string StatusDesc { get; set;} 
} 

Теперь оба этих классов в одном файле CS. Я хочу получить доступ к свойствам SomeOtherClass через ClassName.

Как это сделать?

Спасибо, кучка.

Я думаю, что нужно добавить контроллер, чтобы быть более ясным:

Это функция контроллера:

public void UpdateSession(SessionDetails requestModel) 
{ 

    using (Entities tokus = new Entities()) 
    { 

     var sessionDetails = requestModel; 


     switch (sessionDetails.ServiceType) 
     { 
      case "Provider Service": 

       var fafa = new ClassName(); 

      fafa.SessionID = sessionDetails.SessionID; 
      fafa.SessionStatusID = sessionDetails.SessionStatus; 
      fafa.StartDate = sessionDetails.StartDate; 
      fafa.EndDate = sessionDetails.EndDate; 
       fafa.class.AttendanceStatusID = sessionDetails.subclassfromSessionDetails.AttendanceStatus; 

      UpdateServiceLog(fafa); 

Последнее fafa.Providers.AttendanceStatusID = sessionDetails.staff.AttendanceStatus; дает мне squigly строки для undefined как ошибка. почему он не распознает этот подкласс ???

И UpdateServiceLog - это еще одна функция, которая требует ClassName как входной.

+6

Возможно, вам будет лучше работать с вводным учебным курсом или курсом на C#, так как в настоящее время код, который вы опубликовали, не будет компилироваться ('class' является зарезервированным словом, поэтому свойство по этому имени в определении ClassName не будет компилироваться). –

+1

Ваш образец кода не компилируется как есть. У вас есть круглые скобки после 'public class SomeOtherClass()', и у вас есть идентификатор с именем 'class'. Однако, похоже, что 'ClassName' имеет экземпляр' SomeOtherClass' как свойство, поэтому вы можете получить доступ к его свойствам через это. Какова конкретная ошибка, которую вы получаете? –

+0

То, что я действительно делаю на большой картинке, - это передача данных с одного объекта на другой. У меня есть функция в другом файле cs, который действует как контроллер. Я устанавливаю класс ClassName там, как этот var fafa = new ClassName(); – froglim

ответ

-2

Сначала вам нужно создать новые объекты из обоих классов. Затем присвойте Someotherclass свойство в классе Classname. Затем вы можете получить доступ к свойствам SomeotherClass. См. Приведенный ниже код.

var className= new ClassName() 
{ 
SomeOtherClass=new SomeOtherClass() 
}; 

var statisId=className.SomeOtherClass.StatusId; 

Сообщите мне, если это решает вашу проблему.

+0

Зачем голосовать? Можете ли вы объяснить, что не так в этом решении? –

+1

Ну, это был не я, который вас ниспровергал, но сразу с места в карьер, SomeOtherClass = new SomeOtherClass() следует изменить на class = new SomeOtherClass(), чтобы это скомпилировалось, а также OP хотел знать, как получить доступ к SomeOtherClass изнутри ClassName - это показывает, как создавать экземпляры как из третьего класса. Этого достаточно из двух строк кода, чтобы гарантировать понижение. –

0

Класс обычно представляет собой объект реального мира, такой как «автомобиль». Если у вас десять автомобилей, вам нужно десять экземпляров класса автомобилей. Если вы используете этот шаблон, вам нужно создать экземпляр SomeOtherClass в вашем первом классе, чтобы его использовать. Вы уже сделали это в своем примере - у вас есть экземпляр SomeOtherClass, называемый «class». Чтобы получить доступ к одному из его свойств, вы должны сказать class.StatusID или class.StatusDesc.

Public class ClassName 
{ 

    public ClassName(){} 

    public string Name {get; set;} 
    public SomeOtherClass class {get; set;} 

    public bool SampleMethod() 
    { 
     if (class.StatusId == 1) 
      return true; 
     else 
      return false; 
    } 

} 

public class SomeOtherClass() 
{ 
    public int StatusId {get; set;} 
    public string StatusDesc { get; set;} 
} 

Обратите внимание, что если у вас есть десять переменных типа SomeOtherClass, все они могут иметь разные StatusID, так же, как и десять различных автомобилей может иметь десять разных цветов. Вы переходите в конкретный пример, который вас интересует.

+0

Я был бы осторожен, делая широкие заявления типа «Класс обычно представляет объекты реального мира». Я не думаю, что это правда, даже в целом. «Рассмотрим класс, который представляет собой автомобиль ...» было бы гораздо лучшим способом представить этот пример. Классы обычно представляют собой логическую единицу данных и любые связанные с ней методы, используемые для косвенного воздействия на эти данные. Эта единица данных может иметь или не иметь эквивалента в реальном мире (например, что такое «битмап» в физическом мире? Как насчет «Socket» или «File Handle»?) – Dan

+0

@ Elemental_Pete Я был бы счастлив если бы вы могли посмотреть мои обновленные qs. Я сопоставляю в своем контроллере. Есть проблема. Я был бы рад получить больше информации о моей структуре функции в контроллере. Спасибо – froglim

+0

@Dan - растровые изображения, как правило, представляют фотографии котят или обнаженных женщин в физическом мире, гнезда - это места, где вы устанавливаете соединения (например, электрический разъем), а файловые дескрипторы - это то, что вы хватаете и тянете к себе, чтобы получить файл кабинета, поэтому все они имеют, по крайней мере, метафорические эквиваленты в реальном мире, но взяты. Я просто старался держать его в покое :) –

0

Это вводный материал, и я настоятельно рекомендую учебники и просмотр MSDN.

У вас есть в основном три варианта. Вы можете использовать код, который вы уже имеете и проверить свойство так:

var x = new ClassName(); 
var whatWeWant = x.SomeOtherClass.StatusID; 

Вы можете сделать это, потому что это public свойство.

В других ситуациях лучше inherit. Вы делаете это, если один класс является подклассом другого (т.«Автомобиль» в качестве суперкласса и «седан» в качестве подкласса)

Public class ClassName : SomeOtherClass 
{ 

public ClassName() 
{ 
public string Name {get; set;} 
public SomeOtherClass class {get; set;} 

} 

public class SomeOtherClass() 
{ 
public int StatusId {get; set;} 
public string StatusDesc { get; set;} 
} 

И называют свойство, как будто это только часть ClassName:

var x = ClassName.StatusId; 

Наконец, вы можете объявить один, чтобы быть static , Static классы, значения и методы аналогичны по понятию «global». Вы не создаете экземпляр, но вы можете называть их почти везде. Опасность заключается в том, что их ценность сохраняется; если две вещи называют то же самое свойство static, они получат одинаковое значение. Если это нежелательно, вам нужны указанные выше методы.

Public class ClassName 
{ 

public ClassName() 
{ 
public string Name {get; set;} 
public SomeOtherClass class {get; set;} 

    public string GetOtherClass() 
    { return SomeOtherClass.StatusDesc; } 

} 

public static class SomeOtherClass() 
{ 
public static int StatusId {get; set;} 
public static string StatusDesc { get; set;} 
} 
0

ОК, во-первых, я хотел бы дать краткий обзор ошибок в исходном коде, чтобы помочь вам понять, почему вы получаете волнистые линии ...

Public class ClassName // "Public" needs to be lowercase 
{ 
    public ClassName(){} 

    public string Name {get; set;} 
    public SomeOtherClass class {get; set;} // "class" is a reserved word and 
              // can't be used as a property name. 
              // You're probably getting a squiggly here. 
} 

public class SomeOtherClass() // A class declaration doesn't end in parentheses 
           // This will give you some more squigglys. 
{ 
    public int StatusId {get; set;} 
    public string StatusDesc { get; set;} 
} 

Вот исправленный код:

public class ClassName 
{ 
    public ClassName() { } 

    public string Name { get; set; } 
    public SomeOtherClass OtherClass {get; set;} 
} 

public class SomeOtherClass 
{ 
    public int StatusId { get; set; } 
    public string StatusDesc { get; set; } 
} 

Теперь вы можете использовать эти классы в контроллере, как это:

switch (sessionDetails.ServiceType) 
    { 
     case "Provider Service": 
      var foo = new ClassName(); 
      foo.Name = sessionDetails.SessionName; 
      foo.OtherClass.StatusId = sessionDetails.subclassfromSessionDetails.SessionStatusId; 
      foo.OtherClass.StatusDesc = "Kerfuffle"; 
      break; 
     // More cases here... 
    } 

Обратите внимание: я использовал свойства, которые вы указали в исходном коде, чтобы указать на ошибки синтаксиса. Из вашего кода контроллера очевидно, что у вас будут разные имена свойств (SessionStatusID, StartDate и т. Д.). Так как я не знаю типов свойств внутри sessionDetails, может быть несоответствие типа, поэтому, пожалуйста, используйте приведенный выше код как пример процесса назначения значений.

+0

Спасибо. Это абсолютно правильные задания. Я отвечу на мои вопросы и объясню, почему ваш подход был тем, что я пытался сделать, но он просто не работал. – froglim

0

Хорошо посмотрев мой код, я понял, что у меня есть экземпляр списка, и поэтому мое отображение не работало. Итак, метод @Kasun Koswattha правильный, если у меня был экземпляр моего класса как свойство. Поэтому, потому что это был список, я должен был сделать это в моем контроллере:

TOK_ServiceLog fafa = new TOK_ServiceLog(); 

fafa.Providers = sessionDetails.staff.Select(s => new TOK_ServiceLog_Provider() 
       { 
        StaffID = s.StaffID, 
        ServiceID = s.ServiceID, 
        AttendanceStatusID = s.AttendanceStatusID, 
        IsSubstituted = s.IsSubstituted, 
        SubstituteStaffID = s.SubstituteStaffID, 
        Comments = s.Comments 

       }).ToList(); 

Примечание: Оба провайдеры и сотрудники списки. А остальные свойства были назначены непосредственно:

fafa.SessionID = sessionDetails.SessionID; 
fafa.SessionStatusID = sessionDetails.SessionStatus; 
fafa.StartDate = sessionDetails.StartDate; 
fafa.EndDate = sessionDetails.EndDate; 
fafa.ServiceName = sessionDetails.ServiceName; 

Еще раз спасибо за все входные.