如何克服C#List <generic <t>&gt;约束

时间:2017-03-15 15:45:24

标签: c# list generics inheritance

我有以下情况:

我有几个Event类,它们共享StartEvent和StopEvent等常见行为 每个Event类都有一个特殊的类(如拾取器,你需要收集所有这些以完成事件)
所以我认为我将使BaseEvent类具有通用性,并且每个派生版本都提供其特殊的合作伙伴类,因此我可以有一个基本实现来将每个列表保留在列表中。 现在棘手的部分是,我有一个需要知道所有事件的EventManager。但据我所知,C#无法做到这一点:

List<BaseEvent<T>> baseEvents = new List<BaseEvent<T>>();

这个简单的限制杀死了整个概念。我读到了使用与BaseClass平行的接口能够将它们放入列表中,但这真的是我唯一的选择吗?

2 个答案:

答案 0 :(得分:3)

简单的选项是使<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> </head> <form id="werkgever-form"> First name:<br> <input type="text" name"first_name"><br> Last name:<br> <input type="text" name="lastname"> </form> <a href="#" onClick="doSomething();">Send</a> <body> <script> (function($) { $(".em-booking-form").attr('id', 'werkgever-form'); $('#masterclasses_repertoire').attr('placeholder','(max. 2000 tekens)'); $('#masterclasses_biografie').attr('placeholder','(max. 2000 tekens)'); $('#masterclasses_motivatie').attr('placeholder','(max. 2000 tekens)'); $('#masterclasses_opmerkingen').attr('placeholder','(specifieke dieetbehoeften)'); $(".em-attendee-fieldset").insertAfter($(".input-field-workshop_opmerkingen")); $(".em-attendee-fieldset").insertAfter($(".input-field-master_final_opmerkingen")); $(".em-attendee-fieldset").insertAfter($(".input-field-master_passief_opmerkingen")); $(".facturatiegegevens, .input-field-workshop_gelijk_adres, .input-field-factuur_bedrijf, .input-field-factuur_naam_contactpersoon, .input-field-factuur_email_contactpersoon, .input-field-factuur_straat, .input-field-factuur_nummer, .input-field-factuur_bus, .input-field-factuur_postcode, .input-field-factuur_gemeente, .input-field-factuur_land, .input-field-factuur_btw-nummer, .input-field-factuur_opmerkingen").wrapAll("<div class='kader'></div>"); $(".postid-4465 .aanmelden").prop("value", "Aanmelden"); $('input[value="Ik heb geen factuur nodig."]').attr('checked',true); $('.input-field-workshop_akkoord').after('<a id="werkgever-button" class="btn btn-primary" href="#" onClick="doSomething()">Reservering versturen</button>'); $(".em-booking-gateway").css('display', 'block'); $("input[name='workshop_wenst_u_een_factuur']").click(function () { $('.facturatiegegevens').css('display', ($(this).val() === 'Ik heb geen factuur nodig.') ? 'none':'block'), $('.kader').css('display', ($(this).val() === 'Ik heb geen factuur nodig.') ? 'none':'block'), $('.em-booking-gateway').css('display', ($(this).val() === 'Mijn werkgever zal betalen.') ? 'none':'block'), $('.em-booking-buttons').css('display', ($(this).val() === 'Mijn werkgever zal betalen.') ? 'none':'block'), $('#werkgever-button').css('display', ($(this).val() === 'Mijn werkgever zal betalen.') ? 'block' : 'none'), $('.input-field-workshop_gelijk_adres').css('display', ($(this).val() === 'Ik heb wel een factuur nodig.') ? 'block':'none'), $('.input-field-factuur_bedrijf').css('display', ($(this).val() === 'Ik heb geen factuur nodig.') ? 'none':'block'), $('.input-field-factuur_naam_contactpersoon').css('display', ($(this).val() === 'Ik heb geen factuur nodig.') ? 'none':'block'), $('.input-field-factuur_email_contactpersoon').css('display', ($(this).val() === 'Ik heb geen factuur nodig.') ? 'none':'block'), $('.input-field-factuur_straat').css('display', ($(this).val() === 'Ik heb geen factuur nodig.') ? 'none':'block'), $('.input-field-factuur_nummer').css('display', ($(this).val() === 'Ik heb geen factuur nodig.') ? 'none':'block'), $('.input-field-factuur_bus').css('display', ($(this).val() === 'Ik heb geen factuur nodig.') ? 'none':'block'), $('.input-field-factuur_postcode').css('display', ($(this).val() === 'Ik heb geen factuur nodig.') ? 'none':'block'), $('.input-field-factuur_gemeente').css('display', ($(this).val() === 'Ik heb geen factuur nodig.') ? 'none':'block'), $('.input-field-factuur_land').css('display', ($(this).val() === 'Ik heb geen factuur nodig.') ? 'none':'block'), $('.input-field-factuur_btw-nummer').css('display', ($(this).val() === 'Ik heb geen factuur nodig.') ? 'none':'block'), $('.input-field-factuur_opmerkingen').css('display', ($(this).val() === 'Ik heb geen factuur nodig.') ? 'none':'block'); }) $("#workshop_gelijk_adres").change(function() { if(this.checked) { //get the values of the filled fields $naam = $("#workshop_naam").val(); $email = $("#user_email").val(); $straat = $("#workshop_straat").val(); $nummer = $("#workshop_nummer").val(); $bus = $("#workshop_bus").val(); $postcode = $("#workshop_postcode").val(); $gemeente = $("#workshop_gemeente").val(); $land = $("select.workshop_land").val(); console.log("name"); // then add those values to your billing infor window feilds $("#factuur_naam_contactpersoon").val($naam); $("#factuur_email_contactpersoon").val($email); $("#factuur_straat").val($straat); $("#factuur_nummer").val($nummer); $("#factuur_bus").val($bus); $("#factuur_postcode").val($postcode); $("#factuur_gemeente").val($gemeente); $("select.factuur_land").val($land); // then form will be automatically filled .. } else { $('#factuur_naam_contactpersoon').val(''); $("#factuur_email_contactpersoon").val(''); $("#factuur_straat").val(''); $("#factuur_nummer").val(''); $("#factuur_bus").val(''); $("#factuur_postcode").val(''); $("#factuur_gemeente").val(''); $("select.factuur_land").val(''); } }) })(jQuery); function doSomething() { var form = $('#werkgever-form'); var formdata = form.serialize();// 1 $.post("http://www.lowie-design.be/test/voice-academy/wp-includes/werkgever.php",formdata, function(data){ //2 //here you can do different action after make you post request //4 }); form.hide(); //3 } </script> </body> </html> 实现接口或基类:

BaseEvent<T>

现在你可以这样做:

public interface IBaseEvent
{
}

public class BaseEvent<T> : IBaseEvent
{
}

答案 1 :(得分:0)

您的代码是否未编译?您的实施应该有效。

static class Program
{
    /// <summary>
    /// Der Haupteinstiegspunkt für die Anwendung.
    /// </summary>
    [STAThread]
    static void Main()
    {
        var x = new EventManager<Partner>();
    }
}

public class EventManager<T>
{
    List<BaseEvent<T>> baseEvents = new List<BaseEvent<T>>();
}

public class BaseEvent<T>
{
}

public class MyEvent<T> : BaseEvent<T>
{
}

public class Partner
{
}