首页 > 解决方案 > 如果所有类型都具有相同的功能,则从泛型类型调用函数方法

问题描述

我有一个具有通用参数的函数

传递的泛型将是两个 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
}

标签: c#wcfgenerics

解决方案


您可以为此目的创建一个界面

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.


推荐阅读