gpt4 book ai didi

.net - 动态对象,带if语句,如何改进这个功能

转载 作者:行者123 更新时间:2023-12-05 00:54:22 24 4
gpt4 key购买 nike

    public dynamic obj1( dynamic obj2)
{
if (obj2.GetType() == typeof(Obj3)
{
//do something
}

if (obj2.GetType() == typeof(Obj4)
{
//do something else
}

if (obj2.GetType() == typeof(Obj5)
{
//do something else
}

//return something
}

有什么办法可以改进吗?我要与大约 70 个不同的对象进行比较,我不能使用反射..我不知道我还能如何改进它。

这个函数的调用者将传递正确的类型(不是动态的),但它返回一个动态的,我真的不知道从哪里开始

最佳答案

你可以用一流的函数做一些事情,这绝对是我在 javascript 之类的东西中做的事情。

但是,即使在 C# 中,函数式方法也更加简洁,更易于测试,并且删除了大部分样板文件。在我看来,面向对象的替代方案只是在意图方面混淆了水域:

这是一个使用 lambda 的简化示例:

using System;
using System.Collections.Generic;
class MainClass {
public static void Main (string[] args) {

var contents = new Dictionary<System.Type, Func<dynamic, string>>
{
{typeof(int), o => "is int"},
{typeof(string), o => "is string"}
};

Func<dynamic, string> worker = o => contents[o.GetType()](o);

Console.WriteLine(worker(1));
Console.WriteLine(worker("foo"));
}
}

你可以在这里运行它: https://repl.it/CGJO/4

您为要处理的每种类型在字典中放置一个函数。当然,如果函数很长,那么你就不会使用 lambda,你会像这样声明它们:

Func<dynamic, string> intFunc = delegate(dynamic o)
{ return "Is integer";};
Func<dynamic, string> stringFunc = delegate(dynamic o)
{ return "Is string";};

var contents = new Dictionary<System.Type, Func<dynamic, string>>
{
{typeof(int), intFunc}, {typeof(string), stringFunc}
};

https://repl.it/CGJO/8

关于.net - 动态对象,带if语句,如何改进这个功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36654086/

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