2015-09-28 1 views
0
public class Address 
{...} 

public class Object1 
{ 
    public Address Address {get;set;} 
} 

public class Object2 
{ 
    public Address Address {get;set;} 
} 

public UpdateAddress(Address address) 
{ 
    address = new Address(); 
} 

//calling 
var obj1 = new Object1(); 
UpdateAddress(obj1.Address); 

//obj1.Address IS NULLПередача имущества по ссылке в метод (одноименная различные классы)

Я не могу иметь мои 2 классы наследуют от BaseClass, который имеет свойство Address (длинная история)

У меня создалось впечатление, что при передаче объектов в методы они ссылаются, а мой объект obj1.Address будет иметь новый и не будет null, если я передам это свойство в метод.

Если мое предположение неверно и, похоже, об этом объекте не передается ссылкой в ​​этом случае.

Как я могу иметь общий метод, который я могу обновить свойство, которое одинаково во всех моих объектах (я знаю, что может вернуть новый объект адреса, но я предпочитаю, чтобы быть передан в вместо возвращения)

Можно ли это сделать, пройдя T <>?

ОБНОВЛЕНИЕ - Фактический код

Вызов методов

bool isVendorIdFromModel = UpdateVendor(entity.ExpenseVendor, entity.ExpenseVendorId, model, isNew, context); 
if (isVendorIdFromModel) 
{ 
    entity.ExpenseVendorId = model.VendorId; 
} 

private static bool UpdateVendor(ExpenseVendor vendor, int? entityVendorId, ExpenseBaseModel model, bool isNew, ELMSContext context) 
    { 
     if (model.VendorId.HasValue) 
     { 
      if (entityVendorId != model.VendorId) 
      { 
       return true; 
      } 
      UpdateVendorInfo(model, vendor); 

     } 
     else 
     { 
      if (isNew && !string.IsNullOrEmpty(model.VendorName)) 
      { 
       vendor = new ExpenseVendor 
       { 
        ... 
       }; 
       context.ExpenseVendors.Add(vendor); 

      } 
      if (vendor != null) 
      { 
       UpdateVendorInfo(model, vendor); 
      } 
     } 
     return false; 
    } 
    private static void UpdateVendorInfo(ExpenseBaseModel model, ExpenseVendor vendor) 
    { 
     vendor.Name = model.VendorName; 
     vendor.Address1 = model.Address1; 
     vendor.Address2 = model.Address2; 
     vendor.City = model.City; 
     vendor.PostalCode = model.PostalCode?.Replace(" ", string.Empty); 
     vendor.ProvinceId = model.ProvinceId; 
    } 
+0

Можно ли реализовать оба класса из одного интерфейса? Обратитесь к этой статье из Jon http://www.yoda.arachsys.com/csharp/parameters.html, чтобы иметь хорошее представление о передаче параметров. –

+2

«Я был под что при передаче объектов в методы они ссылаются «Нет, это не так. Объекты вообще не передаются.Ссылки передаются по значению. См. Http://pobox.com/~skeet/csharp/parameters.html –

+0

@SriramSakthivel, к сожалению, они не могут, это классы инфраструктуры сущности, а Address - общая таблица, которая становится свойством каждого из объектов. – Zoinky

ответ

0

Если UpdateAddress только возвращает адрес, измените его на:

public Address UpdateAddress() 
{ 
    // set up address 
    return address; 
} 


var obj1 = new Object1(); 
obj1.Address = UpdateAddress(); 

Передача по ссылке и манипулируя содержимое Параметр - это запах кода. Напишите методы, возвращающие значения и задающие свойство таким образом.

+0

Метод уже возвращает int (не показано в примере), но я предполагаю, что могу его изменить, чтобы возврат был более общим. Я пытался избежать возврата объектов, возможно, придется это делать в любом случае – Zoinky

+0

@ Zoinky, в чем цель этого int? Вы пытаетесь вернуть адрес через «черный ход», пытаясь рассматривать его как ссылку. –

+0

обновил исходную тему с помощью фактического кода и почему возвращал int ... – Zoinky

2

Обычные опции:

  • разделяемого базовый класс (если вы не можете изменить код и иерархию классов)
  • общих интерфейс (если вы можете изменить код, но не иерархия классов)
  • пасс лямбды для геттер/сеттер
  • использование отражения и установить по имени

Поскольку это звучит, как вы не можете изменить источник лямбда-оп может быть самым простым. Ниже приводится вариант «установить» (при замене всего объекта):

public void UpdateAddress(Action<Address> addressSetter) 
{ 
    addressSetter(new Address()); 
} 

//calling 
var obj1 = new Object1(); 
UpdateAddress(address => obj1.Address = address); 

Если вам нужно установить свойства такого объекта вместо замены - передать get делегата:

public void UpdateAddress(Func<Address> addressGetter) 
{ 
    addressGetter().Street = "Dark alley"; 
} 
UpdateAddress(address => obj1.Address); 

Или использовать оба. Вы можете даже объединить их в класс-помощник, чтобы он был близок к свойствам (посмотрите adapter pattern.

Примечание: генераторы не помогут вам, если вы не можете добавить общий интерфейс (но в этом случае вам, вероятно, не нужны дженерики при все).

+0

обновил исходную тему с помощью фактического кода и почему возвратил int ... – Zoinky

+0

@ Zoinky Предполагаю, вы хотели просто изменить * некоторые * свойства «Адрес», ? (см. обновленный) ... Не уверен, что «зачем возвращать int». относится к. –

+0

Просто то, что я пытаюсь сделать, - это если запись новая, либо они выбрали поставщика (Vendorid заполняется), либо другие свойства взяты из модели, такой как адрес имени и т. Д. Если, однако, запись является обновлением, тогда сделайте обязательно обновите компоненты адреса из полей. В целом мне нужно переоценить мою стратегию настройки поставщика, потому что код становится запутанным – Zoinky

Смежные вопросы