0

所以我有一个命名空间:

namespace Main
{
  Class DoStuff
  {
    Code...

    var tableVars = new Dictionary<string, tableObject>();

    Code...

    string insertResponse = MyDLL.Insert(someString, tableVars, someString);

    Code../

  }
  public class tableObject
  {
    public string Name { get; set; }
    public string Type { get; set; }
    public string Value { get; set; }
    public string Default { get; set; }
  }
}

我有第二个命名空间:

namespace MyDLL
{
  public static string Insert(string table, Dictionary<string, tableObject> tableVars, string connection)
  {
    Code...
  }
}

在我的第一个命名空间 Main 中,我引用了第二个命名空间 MyDLL。如何在不引用我的 Main 命名空间的情况下让 DLL 识别我的自定义对象(因为这会导致循环引用)?

我也尝试使用 var 关键字,但在这种情况下不起作用:

namespace MyDLL
    {
      public static string Insert(string table, var tableVars, string connection)
      {
        Code...
      }
    }
4

2 回答 2

3

将所有常见类型(在本例中为 tableObject)移动到第三个 dll 并从两个更高的程序集中引用他

于 2013-02-21T14:55:15.197 回答
1

我昨天在阅读 .NET 4.0 中引入的 ExpandoObject,使用这种对象类型,您可以在运行时动态创建对象并将对象传递到另一个命名空间。

这不是一个完美的解决方案,因为可能存在性能问题(我无法相信 Expando 对象与静态对象一样快)。也没有编译(或运行)时检查以确保添加了所有字段。

Dynamic/ExpandoObject 还支持向对象添加方法。

但是,这里有一些示例源:

    void Method1()
    {


        var tableVars = new Dictionary<string, dynamic>();

        dynamic sampleObject = new ExpandoObject();
        sampleObject.Name = "Count";
        sampleObject.Type = "Int32";
        sampleObject.Value = "4";
        sampleObject.Default = "0";

        tableVars.Add("Sample", sampleObject);

        Insert("TableName", tableVars, "Connection");


    }

    string Insert(string table, Dictionary<string, dynamic> tableVars, string connection)
    {

        foreach (var v in tableVars)
        {
            Console.Write("Name is: ");

            Console.WriteLine(v.Value.Name);

        }

        return "";
    }

根据您的情况,按照@Benny 在他的回答中指出的那样做可能会更好,但我想介绍 DLR 的元素作为一个选项

于 2013-02-21T15:18:26.243 回答