获得一个类型

时间:2009-08-25 15:22:27

标签: c# reflection

我正在尝试获取对象的类型,就像我的应用程序的后续部分一样。这主要是为了一个疯狂的情况,如果我可以让这个工作,将会更加清洁。我写了下面的单元测试,希望能解释我希望能够工作的内容。

using System;
using NUnit.Framework;
using NUnit.Framework.SyntaxHelpers;

namespace Test.Helper
{
    [TestFixture]
    public class CastingTests
    {
        public interface IStub { }
        public class Stub : IStub { }

        protected static Type GetCast(object sample)
        {
            //TODO work on getting method to return casted type
            throw new NotImplementedException();
        }

        [Test]
        public void GettingCastReturnsCastedType()
        {
            IStub stub = new Stub();
            Type type = GetCast(stub);
            Assert.That(type, Is.EqualTo(typeof(IStub)));
        }
    }
}

我需要找到一种方法从动态样本对象中获取IStub类型。在应用程序中,它可以是传入对象时的任何对象。我不知道这是否可能,但如果是的话会很酷。感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

转换对象对该对象没有任何实际影响,可能的例外是该类是否定义了对产生副作用的原始值执行操作的显式转换...真正模糊不清和不直观的情况。

至于一般解决方案,不,没有办法确定它“之前”是什么,因为它仍然是同一个对象,只是从代码的角度看作不同的类型。实例本身是一样的。

答案 1 :(得分:1)

我无法100%肯定,但我相信你可以按照以下方式做点什么:

protected static Type GetCast<T>(T obj)
{
   return typeof(T); // NOT obj.GetType();
}

然后:

public void GettingCastReturnsCastedType()
{
    IStub stub = new Stub(); // casted as an IStub
    Type type = GetCast(stub); // see what this returns
}

答案 2 :(得分:1)

对象的类型不会通过强制转换而改变,因此无法查看对象是否已转换为此类型或该类型。它只是表达转换的目标类型的表达式,变量或字段的类型。

所以你能做的最好的事情是分析方法参数或字段以获得类型 - 但这应该没用,因为它是编译时可用的静态信息。

我一直在想什么......你想要实现的目标是什么?