2015-07-13 4 views
1

В методе WhatGenericTypeIAm Я хочу получить информацию о реализации, а не абстракцию родового, так что я мог видеть «Person» not «AbstractModel» Есть ли способ сделать это или это невозможно, нужно перепроектировать?Получение типа из интерфейса

public class Program 
{ 
    private static void Main(string[] args) 
    { 
     var container = new ContainerBuilder(); 
     container.RegisterType<SomeA>(); 
     container.RegisterType<MyDependency>().As<IMyDependency<Person>>(); // generic T is a Person 
     var buildedContainer = container.Build(); 

     var someBase = buildedContainer.Resolve<SomeA>(); 
     someBase.SayName(); 


     Console.ReadKey(); 
    } 
} 

public interface IMyDependency<in T> 
{ 
    void WhatGenericTypeIAm(); 
} 

public class MyDependency : IMyDependency<AbstractModel> 
{ 
    private string objectName = typeof (AbstractModel).Name; 

    public void WhatGenericTypeIAm() 
    { 
     Console.WriteLine("My generic type is " + objectName); // it shows "AbstractModel" but i want to see "Person" 
    } 
} 

public abstract class AbstractModel // will be implemented not only by Person 
{ 

} 

public class Person : AbstractModel 
{ 

} 

public abstract class SomeBaseClass<T> 
where T : AbstractModel 
{ 
    private readonly IMyDependency<Person> _myDependency; 

    public SomeBaseClass(IMyDependency<Person> myDependency) // generic T is Person 
    { 
     _myDependency = myDependency; 
    } 

    public void SayName() 
    { 
     _myDependency.WhatGenericTypeIAm(); 
    } 
} 

public class SomeA : SomeBaseClass<Person> 
{ 
    public SomeA(IMyDependency<Person> myDependency) : base(myDependency) 
    { 

    } 
} 

@BrentWorden хмм я действительно не понимаю, теперь у меня есть это, и это та же самая проблема

namespace ConsoleApplication1 
{ 
public class Program 
{ 
    private static void Main(string[] args) 
    { 
     var container = new ContainerBuilder(); 
     container.RegisterType<SomeA>(); 
     container.RegisterType<SomeB>(); 
     container.RegisterType<MyDependency<AbstractModel>>().As<IMyDependency>(); // generic T is a Person 
     var buildedContainer = container.Build(); 

     var someBase = buildedContainer.Resolve<SomeA>(); 
     someBase.SayName(); 


     Console.ReadKey(); 
    } 
} 

public interface IMyDependency 
{ 
    void WhatGenericTypeIAm(); 
} 

public class MyDependency<T> : IMyDependency 
{ 
    private string objectName = typeof (T).Name; 

    public void WhatGenericTypeIAm() 
    { 
     Console.WriteLine("My generic type is " + objectName); // it shows "AbstractModel" but i want to see "Person" 
    } 
} 

public abstract class AbstractModel // will be implemented not only by Person 
{ 

} 

public class Person : AbstractModel 
{ 

} 

public class OtherPerson : AbstractModel 
{ 

} 

public abstract class SomeBaseClass<T> 
where T : AbstractModel 
{ 
    private readonly IMyDependency _myDependency; 

    public SomeBaseClass(IMyDependency myDependency) // generic T is Person or OtherPerson 
    { 
     _myDependency = myDependency; 
    } 

    public void SayName() 
    { 
     Console.WriteLine("My name is " + typeof(T)); // i want this in _myDependency 

     _myDependency.WhatGenericTypeIAm(); 
    } 
} 

public class SomeA : SomeBaseClass<Person> 
{ 
    public SomeA(IMyDependency myDependency) : base(myDependency) //myDependency T is Person 
    { 

    } 
} 

public class SomeB : SomeBaseClass<OtherPerson> 
{ 
    public SomeB(IMyDependency myDependency) : base(myDependency)  //myDependency T is OtherPerson 
    { 

    } 
} 

}

+1

Есть ли причина, по которой 'T' вообще не используется в' SomeBaseClass'? –

+0

@WiktorZychla no, его можно использовать – UnderNotic

+0

Изменить MyDependency на MyDependency с регистрацией Unitiy. –

ответ

0

Тип MyDependency не имеет ни малейшего представления о Person, даже если вы его запускаете.

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

Таким образом, даже если вы пишете

IMyDependency<Person> dependency = new MyDependency(); 

ваш объект new MyDependency() и IMyDependency<Person> это просто свойство переменной, которую ставят его. В действительности сам объект не имеет ни малейшего понятия о Person, и это Безразлично Нужно иметь его. Все, о чем он заботится, это то, что любой объект, с которым он имеет дело, является или происходит от AbstractModel

2

Класс MyDependency должен быть объявлен как общий класс. Затем вы можете использовать тип родовое делать то, что вы хотите:

public class MyDependency<T> : IMyDependency<T> 
{ 
    private string objectName = typeof(T).Name; 

    public void WhatGenericTypeIAm() 
    { 
     Console.WriteLine("My generic type is " + objectName); 
    } 
} 

, как вы есть сейчас, MyDependency статически типизированный с AbstractModel.

+0

Я действительно не понимаю, после этого у меня такая же проблема, см. Выше – UnderNotic