gpt4 book ai didi

c# - 将通用输入对象传递给方法 C#

转载 作者:行者123 更新时间:2023-11-30 15:21:46 24 4
gpt4 key购买 nike

我有一个方法 ABC() 从我的应用程序中的两个不同位置调用。从这两个地方我都有不同的类对象,这些对象实现了一个公共(public)接口(interface)“IDestination”。

我的两个类和接口(interface)看起来像这样:

public class ClassA: IDestination
{
public string Var1 { get; set; }
public string Var2 { get; set; }
public string Var3 { get; set; }
}

public class ClassB: IDestination
{
public string Var1 { get; set; }
public string Var2 { get; set; }
public string Var3 { get; set; }
public string Var4 { get; set; }
public string Var5 { get; set; }
}

public interface IDestination
{
string Var1 { get; set; }
string Var2 { get; set; }
}

现在Method ABC()接受classA的对象,我希望它也可以接受classB的对象。为此,我将我的方法定义定义为通用的,如下所示:

public string ABC<T>(T obj)
{

}

但是,问题出在我想访问类(classA 和 classB)的属性的 ABC 方法中。

public string ABC<T>(T obj)
{
//Some code
obj.var2; //of classA

obj.var4; //of classB
//Some code
}

而且我不允许在界面中做任何更改。

我怎样才能做到这一点?我不想创建另一种方法来处理不同的类对象。有什么想法吗?

最佳答案

首先,接口(interface)不是继承的,而是实现的

另一方面,可以约束泛型参数:

public string ABC<T>(T obj) where T : IDestination

OP 说:

And I can't allowed to do any changes in the interface.

顺便说一句,根据您的要求和泛型类型约束,您将无法同时接受 classAclassB 因为 C# 不支持多重继承。如果你想访问 classB 成员,你需要扩展你的 IDestination 接口(interface)来定义你想要在 classB 类型中访问的所有属性作为 IDestination:

public interface IDestination
{
string Var1 { get; set; }
string Var2 { get; set; }
string Var3 { get; set; }
string Var4 { get; set; }
string Var5 { get; set; }
}

或者您可以使用其余属性定义第二个接口(interface):

public interface IDestination2
{
string Var3 { get; set; }
string Var4 { get; set; }
string Var5 { get; set; }
}

...您将在 classB 上实现它:

public class ClassB: IDestination, IDestination2

无论如何,这里的问题是您不能约束泛型参数来接受某些给定类的两个不同继承。也就是说,例如,如果您将 T 约束为 IDestinationIDestination2,您将无法赋予 ClassA 作为参数,因为它没有实现 IDestination2

OP 说:

I do not want to create another method for handling different class objects.

实际上,这也可以在没有泛型的情况下解决,但使用方法重载,即使您不想走这条路,这也不是一种邪恶的方法:

public void ABC(IDestination destination) {}
public void ABC(IDestination2 destination) {}

// or directly...

public void ABC(ClassA destination) {}
public void ABC(ClassB destination) {}

否则,您需要按如下方式实现:

public string ABC<T>(T obj) where T : IDestination
{
ClassA a = obj as ClassA;
ClassB b = obj as ClassB;

// Now if you want to access Var1, Var2 you can access them
// using "obj" reference, because T is IDestination
string var1 = obj.Var1;
string var2 = obj.Var2;

if(a != null)
{
// Here access all ClassA members...
}

if(b != null)
{
// Here access all ClassB members...
}
}

对我来说,上述方法是一个设计缺陷。如果我使用泛型类型和接口(interface)是因为我想使用等于泛型类型参数类型的对象。

如果我开始对接口(interface)的特定实现执行向下转换,这就像违背了使用IDestination 的目的,看起来您的方法可能只是接受object 因为您的方法将访问 ClassAClassB 成员而不是 IDestination 成员:

public string ABC(object obj)
{
ClassA a = obj as ClassA;
ClassB b = obj as ClassB;

// Now if you want to access Var1, Var2 you can access them
// using "obj" reference, because T is IDestination
string var1 = obj.Var1;
string var2 = obj.Var2;

if(a != null)
{
// Here access all ClassA members...
}

if(b != null)
{
// Here access all ClassB members...
}

return "";
}

长话短说

总而言之,您应该使用接口(interface)来键入您的对象,并使用通用约束来保证对您的引用进行最少的键入以避免强制转换。否则,泛型类型不是您的解决方案。

关于c# - 将通用输入对象传递给方法 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36786135/

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