两个相同的类在不同的库和一个项目中

本文关键字:一个 项目 两个 | 更新日期: 2023-09-27 18:07:57

我有两个相同的类,它们具有不同的属性,并且位于不同的库中。我在我的项目中引用了这两个库,当我试图访问第二个库的属性时,我得到错误"无法解析符号"。如果其中一个类的设置被重命名为其他东西,一切都可以正常工作。编译器似乎在第一个类中搜索属性,而忽略同名的第二个类。我试图用部分属性来装饰类,将类合并为一个,但似乎只有当类在同一个库中时才有效。任何建议吗?

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

两个相同的类在不同的库和一个项目中

您需要使用名称空间访问第二个:

caLibClient.Settings.MyProperty2

您使用的partial关键字是无用的,因为这是两个不同的类,只是碰巧具有相同的名称。

如果你想让一个类拥有所有的属性,而不是两个不同的类,你可以使用继承来实现。

 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;

这取决于你想完成什么。

尝试使用相同的命名空间。您可以更改其中一个库的默认名称空间。

我有两个具有不同属性的相同类不同库。

这个语句没有多大意义。

如果它们是两个相同的类,那么它们就不会有不同的属性,它们的不同使得它们是唯一的。

我在我的项目中引用这两个库,当我尝试访问第二个库的属性,我得到错误"无法解决象征"。

除了你认为两个不同的类(甚至没有相互继承)会以一种产生错误的方式使用之外,你需要为我们提供代码来解释你究竟做错了什么。

Any suggestion?

我有几个你不会喜欢的:-)

用名称空间完全限定类名。您还可以使用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
     } 
 }

这取决于c#文件中使用它们的using语句。

只假设:

using caLibServer;

当尝试Settings.MyProperty1时,它会看到caLibServer中的一个。

类似于"only":

using caLibClient;

Settings.MyProperty1将只看到caLibServer中的一个。

如果两者都有(不论顺序):

using caLibServer;
using caLibClient;

Settings.MyProperty1将完全失败,您必须指定caLibServer.Settings.MyProperty1Settings.MyProperty1

你可以为它们设置别名,通过这样做:

namesoace SomeProjectThatUsesBoth
{
    using Server_Settings = caLibServer.Settings;
    using Client_Settings = caLibClient.Settings;
    // You usage class here
}

然后您可以使用别名,如Server_Settings.MyProperty1Client_Settings.MyProperty1(假设您将使用比原始名称空间长度更短的别名,我在这里使用下划线来明确这些不是通常的名称,但您不必这样做。唯一的要求是将它们放在命名空间定义)内。