Два идентичных класса в отдельных библиотеках и в одном проекте - PullRequest
3 голосов
/ 06 сентября 2011

У меня есть два идентичных класса с разными свойствами и в разных библиотеках.Я ссылаюсь на эти две библиотеки в моем проекте, и когда я пытаюсь получить доступ к свойствам второй библиотеки, я получаю сообщение об ошибке «Не удается разрешить символ».Если один из классов настроек переименован во что-то другое, все работает нормально.Похоже, что компилятор ищет свойства в первом классе и игнорирует второй класс с тем же именем.Я попытался украсить класс частичным атрибутом, чтобы объединить класс в один, но кажется, что это работает только тогда, когда классы находятся в одной библиотеке.Любое предложение?

Lib1.dll

   namespace caLibServer
    {
        public partial class Settings
        {
            public static string MyProperty1
             //skip code
        }
    }

Lib2.dll

  namespace caLibClient
    {
        public partial class Settings
        {
            public static string MyProperty2
             //skip code
        }
    }

Ответы [ 6 ]

4 голосов
/ 06 сентября 2011

Вам необходимо использовать пространство имен для доступа ко второму:

caLibClient.Settings.MyProperty2

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

1 голос
/ 06 сентября 2011

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

например.

 namespace caLibServer
    {
        public class Settings
        {
            public virtual static string MyProperty1
             //skip code
        }
    }

 namespace caLibClient
    {
        public class Settings : caLibServer.Settings
        {
            public static string MyProperty2
             //skip code
        }
    }

А теперь вы можете иметь:

using caLibClient;

Settings.MyProperty1;
Settings.MyProperty2;

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

например.

caLibServer.Settings.MyProperty1;
caLibClient.Settings.MyProperty2;

Это зависит от того, чего вы пытаетесь достичь.

0 голосов
/ 06 сентября 2011

Это зависит от операторов использования в ваших файлах C #, которые пытаются их использовать.

Только при условии:

using caLibServer;

При попытке Settings.MyProperty1 он увидит тот, что в caLibServer.

Аналогично «только»:

using caLibClient;

Settings.MyProperty1 увидит только один в caLibServer.

При наличии обоих (независимо от порядка):

using caLibServer;
using caLibClient;

Settings.MyProperty1 потерпит неудачу полностью, вам придется указать caLibServer.Settings.MyProperty1 или Settings.MyProperty1.

Вы можете установить псевдонимы для каждого из них, выполнив:

namesoace SomeProjectThatUsesBoth
{
    using Server_Settings = caLibServer.Settings;
    using Client_Settings = caLibClient.Settings;

    // You usage class here
}

Затем вы можете использовать псевдонимы, такие как Server_Settings.MyProperty1 или Client_Settings.MyProperty1 (Предполагая, что вы будете использовать псевдоним, который меньше по длине, чем исходные пространства имен, я здесь использую подчеркивание, чтобы было очевидно, что это не обычные имена, но вы делать это не нужно. Единственное требование - иметь их внутри определения пространства имен ).

0 голосов
/ 06 сентября 2011

Полностью укажите имя класса с пространством имен. Вы также можете упростить ссылки из файла в файл, используя ключевое слово using.

 using Lib2Settings = PC.MyCompany.Project

 public class foo {
     public somemethod() {
         var value1 = caLibClient.Settings.MyProperty1  // fully-qualified
         var value2 = Lib2Settings.MyProperty2          // utilizing the using keyword
     } 
 }
0 голосов
/ 06 сентября 2011

У меня есть два идентичных класса с разными свойствами и в разные библиотеки.

Это утверждение не имеет большого смысла.

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

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

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

Any suggestion?

У меня есть пара, которая вам просто не понравится: -)

0 голосов
/ 06 сентября 2011

Попробуйте использовать то же пространство имен. Вы можете изменить пространство имен по умолчанию для одной из ваших библиотек.

...