6

我正在实现一个接口,以便将自定义业务逻辑注入到利用 Microsoft Unity 的框架中。我的核心问题是我需要实现的接口定义了以下方法:

T InterfaceMethod<T>();

T没有限制。在我的代码中,我需要从不同的 3rd 方库调用一个方法,其方法签名为

T AnotherMethod<T>() where T: class;

类型 T 对 的逻辑很重要AnotherMethod。有什么方法可以AnotherMethod<T>()在我的实现中调用,而不使用反射?T如果是值类型,我显然需要采取替代措施。有没有办法自动装箱来解决这个问题?

4

3 回答 3

2

我不确定这是否正是您所需要的,但这允许您在不使用反射的情况下从 InterfaceMethod 调用 AnotherMethod。它仍然使用 Convert.ChangeType。

这个想法是使类的实现具有约束(此处为 Tin)。然后将 InterfaceMethod 的无约束类型 T 转换为 Tin。最后,您可以使用受约束的类型调用 AnotherMethod。以下适用于字符串。

public interface ITest
{
    T InterfaceMethod<T> (T arg);
}

public interface ITest2
{
    U AnotherMethod<U>(U arg) where U : class;
}

public class Test<Tin> : ITest, ITest2 where Tin : class
{
    public T InterfaceMethod<T> (T arg)
    {
        Tin argU = arg as Tin;
        if (argU != null)
        {
            Tin resultU = AnotherMethod(argU);
            T resultT = (T)Convert.ChangeType(resultU,typeof(T));
            return resultT;
        }
        return default(T);
    }

    public U AnotherMethod<U> (U arg) where U : class { return arg; }
}
于 2012-07-25T18:44:11.093 回答
1

我不认为你正在寻找的东西是可能没有反思的。充其量,您可以调用AnotherMethod<object>()并转换结果。但这只有在AnotherMethod'sT对您的目的不重要时才真正有效。

于 2012-07-25T02:28:24.983 回答
0

其他人说的是你可以通过这样的对象:

public interface ITest
{
    T InterfaceMethod<T>(T arg);
}

public interface IAnotherTest
{
    U AnotherMethod<U>(U arg) where U : class;
}

public class Test : ITest
{
    private IAnotherTest _ianothertest;

    public T InterfaceMethod<T>(T arg)
    {
        object argU = arg as object;
        if (argU != null)
        {
            object resultU = _ianothertest.AnotherMethod(argU);
            T resultT = (T)Convert.ChangeType(resultU, typeof(T));
            return resultT;
        }
        return default(T);
    }
}
于 2012-07-26T17:44:58.070 回答