Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跨项目扩展类的属性和方法_C# - Fatal编程技术网

C# 跨项目扩展类的属性和方法

C# 跨项目扩展类的属性和方法,c#,C#,所以我们想要的是一个跨多个模块扩展的库,每个模块都添加了各自的功能。例如我们的基类 public class Account { public string Username; } 然后在一个单独的包中(比如ActiveDirectory包) 这将把我们的帐户类扩展到 public class Account { public string Username; public UserPrincipal Principal; } 但是,只有在同一项目中才支持使用partial关键字

所以我们想要的是一个跨多个模块扩展的库,每个模块都添加了各自的功能。例如我们的基类

public class Account {
  public string Username;
}
然后在一个单独的包中(比如
ActiveDirectory
包)

这将把我们的
帐户
类扩展到

public class Account {
  public string Username;
  public UserPrincipal Principal;
}
但是,只有在同一项目中才支持使用
partial
关键字。我也不想仅仅将
Account
扩展到
ADAccount
,因为其他模块需要添加自己的属性和方法,并且没有结构化的类层次结构。扩展方法是可能的,但它们只是方法,不能向类存储任何附加数据

实际用例 我希望用户能够

Install-Package BaseLibrary
并获取
公共类帐户{public string Username}
或运行

Install-Package BaseLibrary
Install-Package BaseLibrary-ActiveDirectory
Install-Package BaseLibrary-Twitter
得到

public class Account {
  public string Username;
  public UserPrincipal Principal;
  public Twitter TwitterUser;
}
如何做到这一点?
虽然
ExpandoObject
可以做到这一点,但我显然更喜欢静态类型的选项。

如何做到这一点?这不是装饰器模式的目的吗?我相信装饰器模式意味着所有模块之间都有一个共享接口。在这种情况下,Twitter和AD模块是不相关的。不可能以这种方式向类型添加新属性。只能通过添加来动态扩展对象。我能想到的唯一方法是将实际的代码文件放入您的nuget包中,而不是DLL,并按照您的建议使用分部类。@xori这很好,这就是dynamic/ExpandoObject的用途,但我发现这个问题可能对您的其他想法有所帮助。
public class Account {
  public string Username;
  public UserPrincipal Principal;
  public Twitter TwitterUser;
}