c# - 如果所有类型都具有相同的功能,则从泛型类型调用函数方法
问题描述
我有一个具有通用参数的函数
传递的泛型将是两个 WCF DataContract,每个都有相同的方法函数
[DataContract]
public class FirstPayload
{
public string getProperty()
{
return "1";
}
}
和
[DataContract]
public class SecondPayload
{
public string getProperty()
{
return "2";
}
}
private void MyFunction(T myPayload)
{
// What I want
//how do I call the method getProperty from the generic parameter myPayload?
string currLoad = myPayload.getProperty();
// Less Ideal: have to make logic for each different type.
if (typeof(T) == typeof(FirstPayload)) // long and have to repeat code for each different object
{
FirstPayload firstPayload = (FirstPayload)(object)myPayload;
string currLoad = firstPayload.getProperty();
}
}
有没有办法可以简洁地从参数myPayload调用getProperty方法?我知道我可以先检查 typeof(myPayload),然后根据 myPayload 创建一个对象,然后调用该方法,但这会变得乏味和重复。知道每个对象都将具有相同的 getProperty 函数,我如何才能以最佳方式做到这一点?
编辑:根据反馈创建界面
public interface IGetProperty
{
string getProperty();
}
[DataContract]
public class FirstPayload<T> where T: IGetProperty
{
public string getProperty(T myPayload)
{
return myPayload.getProperty();
}
}
[DataContract]
public class SecondPayload<T> where T: IGetProperty
{
public string getProperty(T myPayload)
{
return myPayload.getProperty();
}
}
两个问题:然后我将如何根据不同的类区分字符串 1 和 2 以及如何从MyFunction中调用它?
private void MyFunction(T myPayload)
{
string test = myPayload.getProperty(); // compile error
}
解决方案
您可以为此目的创建一个界面
public interface IGetProperty
{
string getProperty();
}
使有效负载类实现该接口
[DataContract]
public class FirstPayload : IGetProperty
{
public string getProperty()
{
return "1";
}
}
然后向包含的类添加一个泛型类型约束MyFunction
(当然,也可以在方法上使用类型约束,但泛型似乎是在你的类上定义的)。
class MyClass<T> where T : IGetProperty
{
private void MyFunction(T myPayload)
{
string currLoad = myPayload.getProperty();
}
}
由于类型参数受限于接口,您可以使用该接口的方法(也适用于多个接口)。
编辑
根据您的评论,您似乎缺乏一些基础知识,所以让我详细说明一下。
您不必区分两个方法调用。基本上你要做的是定义一个契约(接口),它告诉:我保证这个类(实现接口)将以某种方式访问(在这种情况下是你的getProperty
方法)。每个拥有实现该接口的任何类的实例的人都知道 xe 可以调用getProperty()
并将获得一个string
(忽略可能发生异常或方法可能返回的事实null
)。
通过将类型参数 ( ) 约束T
到您的接口,我们知道无论将什么对象传递给该方法,它都会提供getProperty
您可以访问的方法。调用什么确切的方法取决于传递给该方法的实例,但您根本不必关心。编译器会注意不传递不实现接口的对象(因为存在类型约束),否则在调用MyFunction
.
推荐阅读
- python - InterpretML 仪表板未显示
- sql - SQL 选择较早的日期(包括 NULL)
- php - Android Studio 上的 RecycleView 不会在屏幕上显示任何数据
- python - 断言错误:
在 df['2017-10-10':'2017-10-25'] - firebase - Nuxt this.$route 未定义
- python - python matplotlib funcAnimate 保存速度很慢
- numeric - 如何找到多项式作为非线性方程的近似解?
- java - 如何在 java 中构造多部分/混合请求体(odata 批处理)
- emacs - 如何从任意文件中获取组织模式文件“标题”和其他文件级属性?
- javascript - 如何避免不必要的类型检查以及来自 API 响应的类型的正确模式或行为?