Приведение типов в c # с использованием строкового имени типа объекта - PullRequest
4 голосов
/ 07 апреля 2011

У меня есть следующий код, должно быть легко следовать через

public class Foo
{
    public void FooHasAMethod()
    {
        Console.WriteLine("it is me, foo!!!");
    }
}

public class Bar
{
    public Foo FooProperty { get; set; }
}

public class FooBar
{
    public static void Main()
    {
        Bar bar = new Bar{ FooProperty = new Foo() };
        CallPropertyByName(bar, "Foo");
    }

    public static void CallPropertyByName(Bar bar, string propertyName)
    {
        PropertyInfo pi = bar.GetType().GetProperty(propertyName + "Property");
        object fooObj = pi.GetValue(bar, null);
        ((Foo)fooObj).FooHasAMethod(); // this works
        /* but I want to use 
         * ((Type.GetType(propertyName))fooObj).FooHasAMethod(); This line needs fix
         * which doesnt work
         * Is there a way to type cast using a string name of a object?
         * */
    }
}

Ответы [ 4 ]

6 голосов
/ 07 апреля 2011

Если вы используете .NET 4, это действительно просто = D

dynamic obj = bar;
obj.FooProperty.FooHasAMethod();

Однако, если вы просто хотите привести результат к другому типу, вы можете сделать это во время выполнения с помощьюМетод Convert.ChangeType:

object someBoxedType = new Foo();
Bar myDesiredType = Convert.ChangeType(typeof(Bar), someBoxedType) as Bar;

Теперь у этого есть сильная связь с фактическими типами Foo и Bar.Тем не менее, вы можете обобщить метод, чтобы получить то, что вы хотите:

public T GetObjectAs<T>(object source, T destinationType)
   where T: class
{
     return Convert.ChangeType(typeof(T), source) as T;
}

Затем вы можете вызывать так:

Bar x = GetObjectAs(someBoxedType, new Bar());

SomeTypeYouWant x = GetObjectAs(someBoxedType, Activator.CreateInstance(typeof("SomeTypeYouWant")));

Используя активатор, вы можете во время выполнения создать любой типты хочешь.И универсальный метод обманом выводит на попытку преобразования из вашего boxedType в тип времени выполнения.

Кроме того, если вы хотите просто вызвать метод для некоторого значения динамического свойства, то лучшим способом (imo) будет просто привести его к какому-либо желаемому объекту.

ISomething propValue = obj.GetProperty("FooPropery").GetValue(obj, null) as ISomething;

if(propValue != null)
    propValue.FooHasAMethod();
5 голосов
/ 07 апреля 2011

Невозможно привести к типу, не известному во время компиляции.

Посмотрите .NET 4.0 динамический тип.

4 голосов
/ 07 апреля 2011
Type fooObjType = fooObj.GetType();
MethodInfo method = fooObjType.GetMethod("FooHasAMethod");
method.Invoke(fooObj, new object[0]);
1 голос
/ 07 апреля 2011

Нет возможности разыграть с помощью строки.Но вы можете использовать dynamic или MethodInfo с invoke

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...