Genericita a typeof operátor – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Genericita a typeof operátor – .NET – Fórum – Programujte.comGenericita a typeof operátor – .NET – Fórum – Programujte.com

 

Jirka
~ Anonymní uživatel
305 příspěvků
2. 11. 2011   #1
-
0
-

Dobrý den,

zajímalo by mě proč mi následující kód nefunguje:(

Mám následující rozhraní:

public interface IRozhrani<T> {}

A následujícího potomka:

public class Potomek: IRozhrani<int> {}

A zajímalo by mě proč tato podmínka není true:

if (instancePotomek.GetType() == typeof(IQuestion<>)) {}

Děkuji za odpověď

Nahlásit jako SPAM
IP: 89.233.158.–
3. 11. 2011   #2
-
0
-

Zdravím,

to nemůže fungovat. Předpokládám, že IQuestion<T> je IRozhrani<T>. Instance potomka pak není typu IRozhrani<>, ale typu IRozhrani<int>. IRozhrani<>je typ generické definice. Dá se k němu dostat takhle. 

if (type.GetGenericTypeDefinition() == typeof(IRozhrani<>)) {}

BTW: Třída Potomek ve skutečnosti není potomkem, protože nic nedědí.

Nahlásit jako SPAM
IP: 91.217.52.–
Dušan Janošík | web: djanosik.cz, @djanosik
Astronaut
~ Anonymní uživatel
2 příspěvky
7. 11. 2011   #3
-
0
-

Checel by som poznamenat, ze implementacia interface a dedenie z triedy je o trosku odlisne (tam si treba popytat zoznam interfacov a tie potom porovnavat ako bolo navrhovane).

using System;
using System.Windows;

namespace WpfApplication14
{
	public interface IRozhranie<T> { }
	public class PriamaImplementacia : IRozhranie<int> { }
	public class DedenaImplementacia : PriamaImplementacia { }

	public partial class MainWindow : Window
	{
		public MainWindow()
		{
			InitializeComponent();
		}

		private void Button_Click(object sender, RoutedEventArgs e)
		{
			MessageBox.Show("DedenaImplementacia -> ICloneable = " + IsDerivedFrom(new DedenaImplementacia(), typeof(ICloneable)).ToString());
			MessageBox.Show("PriamaImplementacia -> IRozhranie = " + IsDerivedFrom(new PriamaImplementacia(), typeof(IRozhranie<>)).ToString());
			MessageBox.Show("DedenaImplementacia -> IRozhranie = " + IsDerivedFrom(new DedenaImplementacia(), typeof(IRozhranie<>)).ToString());
			MessageBox.Show("DedenaImplementacia -> PriamaImplementacia = " + IsDerivedFrom(new DedenaImplementacia(), typeof(PriamaImplementacia)).ToString());
			MessageBox.Show("DedenaImplementacia -> object = " + IsDerivedFrom(new DedenaImplementacia(), typeof(object)).ToString());
			MessageBox.Show("DedenaImplementacia -> string = " + IsDerivedFrom(new DedenaImplementacia(), typeof(string)).ToString());
		}

		public static bool IsDerivedFrom(object instance, Type checkClassType, bool inherited = true)
		{
			var instanceType = instance.GetType();

			// GetInterfaces sa vracia mergnuty (nemusi sa ist na koren)
			if (checkClassType.IsInterface)
			{
				foreach (var currentInterface in instanceType.GetInterfaces())
				{
					if (DerivedTypes(currentInterface, checkClassType))
						return true;
				} // foreach

				return false;
			} // if

			// Ak sa nepytame na interface, tak pojdeme po dedenych triedach
			do
			{
				if (DerivedTypes(instanceType, checkClassType))
					return true;

				if (!inherited)
					return false;

				instanceType = instanceType.BaseType;
			} // do
			while (instanceType != typeof(object));

			return DerivedTypes(instanceType, checkClassType);	// object
		}

		private static bool DerivedTypes(Type sourceType, Type checkType)
		{
			return (sourceType.IsGenericType ? sourceType.GetGenericTypeDefinition() : sourceType) == checkType;
		}
	}

}
Nahlásit jako SPAM
IP: 88.212.36.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 32 hostů

Podobná vlákna

Java-genericita — založil Boxxer

Genericita a dedičnost — založil NotBeginner

Operator - — založil yaqwsx

Operátor &lt;&lt; — založil RePRO

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý