【问题标题】:Creating a Class from Another Class in C# via Roslyn通过 Roslyn 从 C# 中的另一个类创建一个类
【发布时间】:2019-02-12 03:51:06
【问题描述】:

我有一个引用多个第三方库的 .NET Core C# 应用程序。这些库中的每一个都有一个我需要在我的应用程序中使用的对象。有一个问题,我的数据库有两个属性与我在第三方库中需要的每个类中的每个属性相关联。这两个属性是NameDescription

在理想情况下,这些第三方库中的每一个都将使用具有NameDescriptionmy 基类:)。由于这不会发生,我想知道 .NET Core 中是否有一种方法可以动态创建新类型,并使用反射从另一种类型添加属性。

我已经看到了通过 Roslyn 使用文本字符串创建新类型的示例。但是,我不想使用一串文本。我宁愿使用纯代码定义一个类型。然后,我想使用反射来 1)获取第三方类的属性列表,然后 2)将它们添加到我的新类型中。

我知道如何使用反射从类型中获取属性列表。但是,我不确定如何使用 Rosalyn 1)创建一个新类型和 2)向该类型添加新属性。这在 .NET Core 世界中是否可行?我知道那是在 .NET 之前的 .NET Core 时代。但是,我似乎无法弄清楚如何在 .NET Core 中做到这一点。

【问题讨论】:

  • Roslyn 是 c# 编译器。我认为您将其目的误认为是反射。
  • 这个问题我不清楚。您想在运行时使用反射“创建”类型,还是想在构建时使用 Roslyn 创建新类型?
  • 你想要的是 Reflection Emit 或者像 Castle Core 这样的库来动态混合接口?
  • @R1PFake - 我想在运行时“创建”类型。基本上,我想将其中一种第三方类型克隆为一种在运行时包含我的两个属性的新类型。
  • @RicardoAlves - 我查看了Reflection.Emit。但据我了解,它目前没有必要的方法让我在运行时动态创建类型。我基本上想在运行时将其中一种第三方类型克隆为包含我的两个属性的新类型。

标签: c# dynamic


【解决方案1】:

假设你有这个第三方类:

class SomeThirdPartyClass
{
    public object Foo { get; set; }
    public object Bar { get; set; }
}

如果您需要添加属性,只需将其子类化并添加它们:

class MyClass : SomeThirdPartyClass
{
    public string Name { get; set; }
    public string Description { get; set; }
}

//Example use
var o = new MyClass();
o.Name = "Name";           //Custom property
o.Foo = new object();      //Base property

如果第三方类是sealed,可以改为wrap。

class MyClass<T>
{
    public string Name { get; set; }
    public string Description { get; set; }
    public T Item { get; set; }
}

//Example use
var o = new MyClass<SomeThirdPartyClass>
{
    Item = new SomeThirdPartyClass()
};
o.Name = "name";            //Custom property
o.Item.Foo = new object();  //Base property

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2018-11-02
    相关资源
    最近更新 更多