Solved

Problem with converting variable to Generic class

Posted on 2016-08-29
11
58 Views
Last Modified: 2016-09-08
I' trying to achieve the following :
I have an interface with an method in it :

---------------------------------------------------------------------
  public interface IDetailPaneUserControl<T>
  {
    T SelectedItem { get; set; }

    Task LoadView(RadPane paneContainer, T item, PaneUserControl parentPane = null);

    Task LoadView(RadPane paneContainer, Guid? id, PaneUserControl parentPane = null);
  }
---------------------------------------------------------------------

The Implementation is like the following :

---------------------------------------------------------------------
 public class DetailPaneUserControl<T> : PaneUserControl, IDetailPaneUserControl<T>, IMayBeClosed where T : class, IBaseEntity, new()
---------------------------------------------------------------------

This class is inherited in my usercontrol.

However I now need to check of a control is of this type and use a method of it. I cannot give with type, but it have to have the IBaseEntity interface.

---------------------------------------------------------------------
 if (item != null)
            {
                var itemType = item.GetType();
                if (paneContent is IDetailPaneUserControl<itemType>)
                    await ((IDetailPaneUserControl<itemType>) paneContent).LoadView(pane, item);
            }
---------------------------------------------------------------------

The item.GetType() isn't working, saying that itemType is a variable but used as an type.

Any idea's how to get the code working?
0
Comment
Question by:MobileAccess
  • 5
  • 3
  • 3
11 Comments
 
LVL 44

Expert Comment

by:AndyAinscow
ID: 41775826
Does changing
var itemType = item.GetType();
to
Type itemType = item.GetType();
cure it?
0
 
LVL 20

Expert Comment

by:Daniel Van Der Werken
ID: 41776176
My guess is that this line:

if (paneContent is IDetailPaneUserControl<itemType>)

is expecting an actual Type in <itemType> and what you're passing in is looked upon as a variable.

If AndyAinscow's solution doesn't fix it, I might try something like:

if (paneContent is IDetailPaneUserControl<Item>)

Open in new window


where
Item 

Open in new window

is the true class name of the itemType object. I don't see that in your code.
0
 

Author Comment

by:MobileAccess
ID: 41779526
The problem is that I cannot code it like that. It needs to be specified at runtime. So I can't place the real name (type) of the item. it needs to be dynamic
0
 
LVL 44

Expert Comment

by:AndyAinscow
ID: 41779538
Do you mean my suggestion doesn't compile and/or run  ?
0
 
LVL 20

Expert Comment

by:Daniel Van Der Werken
ID: 41781718
I think he means mine, because he can't determine the type until run-time.

I'm thinking of using the Dynamic keyword here, but I don't have an example off hand.  It's just a thought and might not really be correct.
0
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 
LVL 44

Expert Comment

by:AndyAinscow
ID: 41781734
It would be nice for the asker to respond so we know which isn't working.  Or close the question if one does actually solve it.
Just guessing is going to waste everyones time.
0
 

Author Comment

by:MobileAccess
ID: 41784298
Andy, I'm sorry, I was sick last week...
Your method I've tried, but the problem stays the same.

Daniel,
Indeed, I do not know the type accept at runtime. I'll take a look at the dynamic approach, haven't used this before...
0
 
LVL 20

Expert Comment

by:Daniel Van Der Werken
ID: 41786076
Apparently, this is doable.

This builds. Not promising you it will run!

        Item item = new Item();
        PaneUserControl paneContent = new PaneUserControl();
        RadPane pane = new RadPane();

        if (item != null)
        {
            var genericItemType = item.GetType();
            var specificItemType = genericItemType.MakeGenericType(item.GetType());
            var list = Activator.CreateInstance(specificItemType);
            if (paneContent is IDetailPaneUserControl<Item>)
            {
                ((IDetailPaneUserControl<Item>)paneContent).LoadView(pane, item);
            }
        }

Open in new window

0
 
LVL 20

Expert Comment

by:Daniel Van Der Werken
ID: 41786088
Ugh. I made a mistake. Let me fix it. That does not answer your question.
0
 
LVL 20

Accepted Solution

by:
Daniel Van Der Werken earned 500 total points
ID: 41786283
Okay. We can't get rid of using  if (myDetailPanelUserControl is IDetailPaneUserControl<Item>) with the actual type, Item, being used. It just won't work as far as I can tell.

However, we can "dynamically" generate everything, I think.

        Item item = new Item();
        RadPane pane = new RadPane();

        if (item != null)
        {
            Type genericIDetailPaneUserControlType = typeof(IDetailPaneUserControl<>);
            Type[] typeArgs = { item.GetType() };
            Type[] methodTypeArgs = new Type[] { typeof(RadPane), item.GetType(), typeof(PaneUserControl) };

            Type specificicIDetailPaneUserControlType = genericIDetailPaneUserControlType.MakeGenericType(typeArgs);

            var myDetailPanelUserControl = Activator.CreateInstance(specificicIDetailPaneUserControlType);

            MethodInfo methodInfo = myDetailPanelUserControl.GetType().GetMethod("LoadView").MakeGenericMethod(methodTypeArgs);

            methodInfo.Invoke(this, new object[] { pane, item });

        }

Open in new window

0
 

Author Comment

by:MobileAccess
ID: 41788386
Thanks, I'll try this tomorrow :)
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
WPF - Tooltips for ComboBox items 5 38
Not showing page correctly 3 31
Not showing JavaScript in the list 5 40
Receiving a string from a WebService Push 21 37
More often than not, we developers are confronted with a need: a need to make some kind of magic happen via code. Whether it is for a client, for the boss, or for our own personal projects, the need must be satisfied. Most of the time, the Framework…
This article aims to explain the working of CircularLogArchiver. This tool was designed to solve the buildup of log file in cases where systems do not support circular logging or where circular logging is not enabled
Windows 10 is mostly good. However the one thing that annoys me is how many clicks you have to do to dial a VPN connection. You have to go to settings from the start menu, (2 clicks), Network and Internet (1 click), Click VPN (another click) then fi…
Both in life and business – not all partnerships are created equal. As the demand for cloud services increases, so do the number of self-proclaimed cloud partners. Asking the right questions up front in the partnership, will enable both parties …

867 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now