gpt4 book ai didi

c# - 具有 "has property X"约束的通用函数?

转载 作者:可可西里 更新时间:2023-11-01 03:09:59 25 4
gpt4 key购买 nike

我有一个导出 COM 接口(interface)的第三方闭源应用程序,我通过 Interop 在我的 C#.NET 应用程序中使用它。此 COM 接口(interface)导出许多对象,这些对象都显示为 System.Object,直到我将它们转换为适当的接口(interface)类型。我想为所有这些对象分配一个属性。因此:

foreach (object x in BigComInterface.Chickens)
{
(x as Chicken).attribute = value;
}
foreach (object x in BigComInterface.Ducks)
{
(x as Duck).attribute = value;
}

但是分配属性很可能(出于不可避免的特定于应用程序的原因)抛出我想从中恢复的异常,所以我真的想尝试/捕获每个异常。因此:

foreach (object x in BigComInterface.Chickens)
{
try
{
(x as Chicken).attribute = value;
}
catch (Exception ex)
{
// handle...
}
}
foreach (object x in BigComInterface.Ducks)
{
try
{
(x as Duck).attribute = value;
}
catch (Exception ex)
{
// handle...
}
}

显然,这样做会干净得多:

foreach (object x in BigComInterface.Chickens)
{
SetAttribute<Chicken>(x as Chicken, value);
}
foreach (object x in BigComInterface.Ducks)
{
SetAttribute<Duck>(x as Duck, value);
}

void SetAttribute<T>(T x, System.Object value)
{
try
{
x.attribute = value;
}
catch
{
// handle...
}
}

看到问题了吗?我的 x 值可以是任何类型,因此编译器无法解析 .attribute。 Chicken 和 Duck 不在任何类型的继承树中,它们不共享具有.attribute 的接口(interface)。如果他们这样做了,我可以在 T 上对该接口(interface)施加约束。但由于类(class)是封闭源代码的,所以这对我来说是不可能的。

在我的幻想中,我想要的是某种约束,要求参数具有 .attribute 属性,而不管它是否实现了给定的接口(interface)。也就是说,

void SetAttribute<T>(T x, System.Object value) where T:hasproperty(attribute)

除了为 Chicken、Duck、Cow、Sheep 等的每一个剪切/粘贴这个小 try/catch block 之外,我不确定从这里可以做什么。

我的问题是:如果在编译时无法知道实现该属性的接口(interface),那么想要调用对象的特定属性的问题有什么好的解决方法?

最佳答案

好吧,根据您的异常处理代码的庞大程度(如果我没记错的话,它可能非常庞大),使用以下技巧可能会对您有所帮助:

class Chicken
{
public string attribute { get; set; }
}

class Duck
{
public string attribute { get; set; }
}

interface IHasAttribute
{
string attribute { get; set; }
}

class ChickenWrapper : IHasAttribute
{
private Chicken chick = null;
public string attribute
{
get { return chick.attribute; }
set { chick.attribute = value; }
}
public ChickenWrapper(object chick)
{
this.chick = chick as Chicken;
}
}

class DuckWrapper : IHasAttribute
{
private Duck duck = null;
public string attribute
{
get { return duck.attribute; }
set { duck.attribute = value; }
}
public DuckWrapper(object duck)
{
this.duck = duck as Duck;
}
}

void SetAttribute<T>(T x, string value) where T : IHasAttribute
{
try
{
x.attribute = value;
}
catch
{
// handle...
}
}

关于c# - 具有 "has property X"约束的通用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1307660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com