如何发出具有两个仅在返回类型上重载的属性的 .NET 类型?

发布于 2024-08-06 08:33:50 字数 547 浏览 3 评论 0原文

我需要创建一个具有两个同名属性的类型,仅返回类型不同。通过反射动态发射这种类型是完全可以接受的。

像这样的事情:

public TypeA Prop { get; }
public TypeB Prop { get; }

我确实知道我无法从 C# 或 VB.NET 或许多其他 .NET 语言使用此属性。

为了防止答案向我解释为什么我不想这样做,让我解释一下为什么我需要它:我需要它来重现错误。

更具体地说,我在 AutoFixture 中遇到了一个错误,其中 Moq 类型会导致它在某些情况下抛出异常。问题是 Moq 发出的类型包含两个名为“Mock”的属性,它们仅在返回类型上有所不同。

我想在单元测试中重现这个场景,但我不想仅仅因为这个原因就依赖 Moq,所以我想在测试套件内部重现该行为。

I need to create a type that has two properties with the same name, and only differ on return type. Dynamically emitting this type via reflection is perfectly acceptable.

Something like this:

public TypeA Prop { get; }
public TypeB Prop { get; }

I do understand that I cannot consume this property from C# or VB.NET or lots of other .NET languages.

To prevent answers that explain to me why I don't want to do this, let me explain why I need it: I need it to reproduce a bug.

More specifically, I have a bug in AutoFixture where a Moq of a type will cause it to throw an exception in certain cases. The problem is that the type emitted by Moq contains two properties both named 'Mock' that differ only on the return type.

I would like to reproduce this scenario in a unit test, but I'd rather not take a dependency on Moq just for that single reason, so I'd like to reproduce the behavior internally in the test suite.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一个人练习一个人 2024-08-13 08:33:50

您可以拥有两个同名的属性,仅类型不同,并且您可以在不动态发出类型的情况下做到这一点:

class Foo
{
    public string X
    {
        get { return "Hello world"; }
    }
}

class Bar : Foo
{
    public new int X
    {
        get { return 42; }
    }
}

void Main()
{
    foreach(PropertyInfo prop in typeof(Bar).GetProperties())
    {
        Console.WriteLine("{0} : {1}", prop.Name, prop.PropertyType);
    }
}

此代码的输出将是:

X:System.Int32
X:系统字符串

You can have 2 properties with the same name that differ only by the type, and you can do that without dynamically emitting the type :

class Foo
{
    public string X
    {
        get { return "Hello world"; }
    }
}

class Bar : Foo
{
    public new int X
    {
        get { return 42; }
    }
}

void Main()
{
    foreach(PropertyInfo prop in typeof(Bar).GetProperties())
    {
        Console.WriteLine("{0} : {1}", prop.Name, prop.PropertyType);
    }
}

The output of this code will be :

X : System.Int32
X : System.String

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文