gpt4 book ai didi

c# - 在不使用接口(interface)的情况下删除冗余的 C# 代码

转载 作者:太空狗 更新时间:2023-10-29 23:56:01 25 4
gpt4 key购买 nike

请考虑两个限制-

  1. 不能将 MyProperty 移动到接口(interface)或抽象类。
  2. FooEventHandler 是一种 dotnet 框架方法,因此无法更改参数类型。

我在几个类中定义了 MyProperty。

class A
{
public string MyProperty { get; set; }
}
class B
{
public string MyProperty { get; set; }
}
class C
{
public string MyProperty { get; set; }
}

方法 FooEventHandler 会为其接收的所有参数更新此属性。

public object FooEventHandler(object obj)
{
object toReturn = null;
if (obj.GetType() == typeof(A))
{
(obj as A).MyProperty = "updated";
toReturn = obj;
}
else if (obj.GetType() == typeof(B))
{
(obj as B).MyProperty = "updated";
toReturn = obj;
}
else if (obj.GetType() == typeof(C))
{
(obj as C).MyProperty = "updated";
toReturn = obj;
}
return toReturn;
}

然后 FooEventHandler 就这样被反复调用 -

static void Main(string[] args)
{
Program program = new Program();
A objA = new A();
program.FooEventHandler(objA);
B objB = new B();
program.FooEventHandler(objB);
C objC = new C();
program.FooEventHandler(objC);
}

考虑到上述两个一般限制,请提出一种删除 Foo 中冗余代码的方法。

更准确地说,我在 WCF 中使用 ParameterInspector 时遇到过这个问题。我正在尝试修改此处拦截的所有请求的属性,并且不得不根据 operationName 编写 Switch Case。

上面说的

A, B, C, D类就是代理。所以一开始不想修改它们。由于更新服务引用将覆盖我的界面更改。

public object BeforeCall(string operationName, object[] inputs){
// update inputs[0] properties
}

感谢您的帮助。

最佳答案

您实际上可以让您的类实现一个接口(interface),以使其更易于使用。关键是生成的服务引用类是部分,这意味着您可以在单独的文件中执行此操作,重新生成代码时不会覆盖该文件:

namespace ServiceReferenceNamespace {
public partial class A : IMyProperty { }
public partial class B : IMyProperty { }
public partial class C : IMyProperty { }
}

IMyProperty 是:

public interface IMyProperty { string MyProperty { get; set; } }

然后您可以更改您的FooEventHandler 方法以获取一个IMyProperty,或者获取一个object 并检查obj is IMyProperty(或使用as,所以检查只进行一次)。这让您可以简单地使用该属性,没有任何反射或动态复杂性以及这些方法的运行时性能影响。

关于c# - 在不使用接口(interface)的情况下删除冗余的 C# 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12733910/

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