Получение отлитого типа - PullRequest
       14

Получение отлитого типа

0 голосов
/ 25 августа 2009

В настоящее время я пытаюсь получить тип объекта, который был приведен, как в более поздней части моего приложения. Это в первую очередь для сумасшедшей ситуации, которая возникла бы намного чище, если бы я мог заставить это работать. Я написал следующий модульный тест, который, надеюсь, объясняет, на что я надеюсь работать.

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 ]

5 голосов
/ 25 августа 2009

Приведение объекта не имеет каких-либо реальных эффектов на этот объект, за исключением возможного исключения, если этот класс должен был определить явное преобразование, которое выполнило операцию с исходным значением, которое произвело побочный эффект ... действительно непонятный и не интуитивная ситуация.

Что касается общего решения, то нет, нет способа определить, что это было «до», потому что это все тот же объект, просто рассматриваемый с точки зрения кода как другой тип. Сам экземпляр тот же.

1 голос
/ 25 августа 2009

Тип объекта не изменяется при приведении, поэтому нет способа увидеть, был ли объект приведен к тому или иному типу. Это просто тип выражения, переменной или поля, представляющий целевой тип приведения.

Таким образом, лучшее, что вы можете сделать, - это проанализировать параметры метода или поля, чтобы получить тип - но это должно быть мало полезно, потому что это статическая информация, доступная во время компиляции.

И что мне все время интересно ... какого чёрта ты пытаешься достичь?

1 голос
/ 25 августа 2009

Я не могу быть уверен на 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...