2013-02-21 50 views
0

所以我有一个命名空间:将自定义对象通过方法调用DLL

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

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

我也尝试使用var关键字,但它并没有在这种情况下工作:

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

回答

1

我在ExpandoObject阅读介绍,昨日在.NET 4.0中,这个对象类型,你可以动态地创建在运行时的对象,并通过与其他命名空间传递对象。

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

动态/ 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的元素作为一个选项

+0

不,它不能用一个简单的谷歌搜索发现,但这里是微软ExpandoObject页面的链接:http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx – 2013-02-21 15:36:28

+0

非常感激! – 2013-02-21 15:47:49

3

移动所有常见类型(tableObject在这种情况下)到3号的DLL和来自较高的参考他组件

+1

在这种情况下,一个简单的答案可能是tableObject的定义移动到MYDLL装配 – 2013-02-21 14:58:01

+0

这真的是唯一的出路?要移动它?没有办法传递自定义对象? – 2013-02-21 14:58:47

+1

呃...不是真的。您可以将它作为对象并使用反射来访问数据。但这没有多大意义。这与“内置”类型相同。两个程序集都知道字符串类型的唯一原因是因为它们都引用了System命名空间/程序集。 如果你想以后使用装配在其他应用程序,你就必须重新定义类型。如果AppA将其定义为与AppB不同,会发生什么? MyDLL应该如何处理对象? – harri 2013-02-21 15:13:11