0

我有一个有两个公共方法的类:

class FirstClass
{    
    public IEntity GetEntity(string byUserName);
    public IEntity GetEntity(int byUserId);
}

我想用一个看起来像这样的泛型类包装这些方法:

class EntityHandler<T>
{
    public IEntity RetrieveEntity (T userParam)
    {
        return firstClass.GetEntity(userParam)
    }
}

当然这行不通,因为userParam此时类型是未知的。如何验证Tintstring然后将参数GetEntity()成功传递给合适的方法?

4

6 回答 6

3

我看不出任何EntityHandler通用的要求

class EntityHandler
{
    FirstClass firstClass = new FirstClass();
    public IEntity RetrieveEntity(int userParam)
    {
        return firstClass.GetEntity(userParam);
    }
    public IEntity RetrieveEntity(string userParam)
    {
        return firstClass.GetEntity(userParam);
    }
}
于 2013-06-21T09:07:35.170 回答
1

只需使用is

class EntityHandler<T>
{
    public IEntity RetrieveEntity (T userParam)
    {
        if(userParam is int)
           return firstClass.GetEntity((int)(object)userParam)
        else if(userParam is string)
           return firstClass.GetEntity((string)(object)userParam)
        else 
           // add your code here
    }
}
于 2013-06-21T09:03:01.263 回答
0

假设 java,您可以使用 instanceof 来确定 userParam 变量的类型:

if(userParam instanceof String){ 
    String param = (String) userParam;
    //yay string
} else if (userparam instanceof Integer) {
    Integer param = (Integer) userParam;
    //yay int
}

C# 有类似的is运算符

于 2013-06-21T09:00:20.023 回答
0

既然您已经知道允许的类型,而且它们不是泛型,那么您为什么要尝试使用泛型来解决问题?只需创建两个使用正确类型调用 GetEntity 的方法。

另一种方法是,您始终可以检查 typeof T 并将其传递给 GetEntity 时将其转换为正确的类型:

var typeOfT = userParam.getType();
if (typeOfT == typeof(string))
{
    return firstClass.GetEntity((string) userParam); //might have to do 'userParam as string' (im duck typing)
}
else if (typeOf(T) == typeof(int))
{
    // call other GetEntity
}
else
{
    //throw
}
于 2013-06-21T08:58:44.837 回答
0

答案是您想要的泛型类不是最好的做法:您应该创建一个具有两个重载的方法,一个用于 int,一个用于 string:

class EntityHandler
{
    public IEntity RetrieveEntity (int userParam) { }
    public IEntity RetrieveEntity (string userParam) { }

}

检查传递对象类型的其他方法很容易在编译时传递除 int 或 string 以外的类型,从而使 API 不直观。

在传递复杂对象类型而不是整数和字符串的情况下,可以让它们实现基本接口并在泛型上使用where 约束。在这种情况下,你不能。

也许你真正追求的是:

class EntityHandler<TEntity> where TEntity : IEntity
{
    public TEntity RetrieveEntity (int userParam) { }
    public TEntity RetrieveEntity (string userParam) { }

}
于 2013-06-21T09:14:19.023 回答
0

您可以尝试以下代码:

public IEntity RetrieveEntity(T userParam)
{
    FirstClass firstClass = new FirstClass();
    if (userParam is string)
        return firstClass.GetEntity((string)(object)userParam);
    else if (userParam is int)
        return firstClass.GetEntity((int)(object)userParam);
    else
        return null; // or new IEntity();
}

userParam已被类型转换为,object以便它可以轻松转换为intorstring或其他类型。

于 2013-06-21T09:12:22.590 回答