RepositoryBase
является не базовым классом MyEntityRepository
. Вы ищете общую дисперсию , которая существует в C # в ограниченной степени, но здесь не применима.
Предположим, что у вашего класса RepositoryBase
был такой метод:
void Add(T entity) { ... }
Теперь рассмотрим:
MyEntityRepository myEntityRepo = GetMyEntityRepo(); // whatever
RepositoryBase baseRepo = (RepositoryBase)myEntityRepo;
baseRepo.Add(new OtherEntity(...));
Теперь вы добавили другой тип сущности в MyEntityRepository
... и это не может быть прав.
В принципе, общая дисперсия является безопасной только в определенных ситуациях. В частности, общая ковариация (именно это вы описываете здесь) безопасна только тогда, когда вы только когда-либо получаете значения «API»; общая контравариантность (которая работает наоборот) безопасна только тогда, когда вы когда-либо вводили значения в API (например, общее сравнение, которое может сравнивать любые две формы по площади, можно рассматривать как сравнение квадратов).
В C # 4 это доступно для общих интерфейсов и общих делегатов, а не для классов - и только для ссылочных типов. См. MSDN для получения дополнительной информации, прочитайте & lt; plug & gt; прочитайте C # в глубине, 2-е издание , глава 13 & lt; / plug & gt; или блога Эрика Липперта по этой теме. Кроме того, я рассказал об этом в NDC в июле 2010 года - видео доступно здесь .
Используя xml linq, я помещаю результаты в словарь, разбирая все свойства в xml
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication97
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
List<Respcondition> responses = doc.Descendants("respcondition").Select(x => new Respcondition()
{
_continue = (string)x.Attribute("continue"),
varequal = (string)x.Descendants("varequal").FirstOrDefault(),
respident = (string)x.Descendants("varequal").FirstOrDefault().Attribute("respident"),
setvar = (string)x.Element("setvar"),
action = (string)x.Element("setvar").Attribute("action"),
linkrefid = (string)x.Element("displayfeedback").Attribute("linkrefid"),
feedbacktype = (string)x.Element("displayfeedback").Attribute("feedbacktype")
}).ToList();
Dictionary<string, List<Respcondition>> dict = responses.GroupBy(x => x.respident, y => y)
.ToDictionary(x => x.Key, y => y.ToList());
}
}
public class Respcondition
{
public string _continue { get; set; }
public string varequal { get; set; }
public string respident { get; set; }
public string setvar { get; set; }
public string action { get; set; }
public string linkrefid { get; set; }
public string feedbacktype { get; set; }
}
}
//<respcondition continue="Yes">
// <conditionvar>
// <varequal respident="gap_0">auswahl1</varequal>
// </conditionvar>
// <setvar action="Add">1</setvar>
// <displayfeedback linkrefid="0_Response_0" feedbacktype="Response"/>
// </respcondition>
<!DOCTYPE questestinterop SYSTEM "ims_qtiasiv1p2p1.dtd">
<!--Generated by ILIAS XmlWriter-->
<questestinterop>
<item title="titel" maxattempts="0" ident="il_0_qst_152800">
<qticomment>beschreibung</qticomment>
<duration>P0Y0M0DT0H1M0S</duration>
<itemmetadata>
<qtimetadata>
<qtimetadatafield>
<fieldlabel>ILIAS_VERSION</fieldlabel>
<fieldentry>5.3.8 2018-08-29</fieldentry>
</qtimetadatafield>
<qtimetadatafield>
<fieldlabel>QUESTIONTYPE</fieldlabel>
<fieldentry>CLOZE QUESTION</fieldentry>
</qtimetadatafield>
<qtimetadatafield>
<fieldlabel>AUTHOR</fieldlabel>
<fieldentry>Patrick Maik Mächler</fieldentry>
</qtimetadatafield>
<qtimetadatafield>
<fieldlabel>additional_cont_edit_mode</fieldlabel>
<fieldentry>default</fieldentry>
</qtimetadatafield>
<qtimetadatafield>
<fieldlabel>externalId</fieldlabel>
<fieldentry>5c3f83ce4b6880.97213190</fieldentry>
</qtimetadatafield>
<qtimetadatafield>
<fieldlabel>textgaprating</fieldlabel>
<fieldentry>ci</fieldentry>
</qtimetadatafield>
<qtimetadatafield>
<fieldlabel>fixedTextLength</fieldlabel>
<fieldentry>1</fieldentry>
</qtimetadatafield>
<qtimetadatafield>
<fieldlabel>identicalScoring</fieldlabel>
<fieldentry>1</fieldentry>
</qtimetadatafield>
<qtimetadatafield>
<fieldlabel>combinations</fieldlabel>
<fieldentry>W10=</fieldentry>
</qtimetadatafield>
</qtimetadata>
</itemmetadata>
<presentation label="titel">
<flow>
<material>
<mattext texttype="text/xhtml"><p>text1</p> <div id="OKAYFREEDOM_INJECTED" style="display: none;"></div></mattext>
</material>
<material>
<mattext texttype="text/xhtml"><p></p> <p>text2</p> <p></p> <p>auswahllücke</mattext>
</material>
<response_str ident="gap_0" rcardinality="Single">
<render_choice shuffle="No">
<response_label ident="0">
<material>
<mattext>auswahl1</mattext>
</material>
</response_label>
<response_label ident="1">
<material>
<mattext>auswahl2</mattext>
</material>
</response_label>
</render_choice>
</response_str>
<material>
<mattext texttype="text/plain">textlücke</mattext>
</material>
<response_str ident="gap_1" rcardinality="Single">
<render_fib maxchars="2" columns="8" prompt="Box" fibtype="String"/>
</response_str>
<material>
<mattext texttype="text/plain">numlücke</mattext>
</material>
<response_num ident="gap_2" rcardinality="Single" numtype="Decimal">
<render_fib maxchars="3" columns="2" prompt="Box" fibtype="Decimal" maxnumber="100" minnumber="1"/>
</response_num>
<material>
<mattext texttype="text/xhtml"></p> <p></p> <div></div> <p></p> <div></div> <div></div></mattext>
</material>
</flow>
</presentation>
<resprocessing>
<outcomes>
<decvar/>
</outcomes>
<respcondition continue="Yes">
<conditionvar>
<varequal respident="gap_0">auswahl1</varequal>
</conditionvar>
<setvar action="Add">1</setvar>
<displayfeedback linkrefid="0_Response_0" feedbacktype="Response"/>
</respcondition>
<respcondition continue="Yes">
<conditionvar>
<varequal respident="gap_0">auswahl2</varequal>
</conditionvar>
<setvar action="Add">2</setvar>
<displayfeedback linkrefid="0_Response_1" feedbacktype="Response"/>
</respcondition>
<respcondition continue="Yes">
<conditionvar>
<varequal respident="gap_1">antwort1</varequal>
</conditionvar>
<setvar action="Add">3</setvar>
<displayfeedback linkrefid="1_Response_0" feedbacktype="Response"/>
</respcondition>
<respcondition continue="Yes">
<conditionvar>
<varequal respident="gap_1">antwort2</varequal>
</conditionvar>
<setvar action="Add">4</setvar>
<displayfeedback linkrefid="1_Response_1" feedbacktype="Response"/>
</respcondition>
<respcondition continue="Yes">
<conditionvar>
<varequal respident="gap_2">99</varequal>
</conditionvar>
<setvar action="Add">5</setvar>
<displayfeedback linkrefid="2_Response_0" feedbacktype="Response"/>
</respcondition>
<respcondition continue="Yes">
<conditionvar>
<varequal respident="gap_0">auswahl2</varequal>
<and>
<varequal respident="gap_1">antwort2</varequal>
</and>
<and>
<varequal respident="gap_2">99</varequal>
</and>
</conditionvar>
<displayfeedback linkrefid="response_allcorrect" feedbacktype="Response"/>
</respcondition>
<respcondition continue="Yes">
<conditionvar>
<not>
<varequal respident="gap_0">auswahl2</varequal>
<and>
<varequal respident="gap_1">antwort2</varequal>
</and>
<and>
<varequal respident="gap_2">99</varequal>
</and>
</not>
</conditionvar>
<displayfeedback linkrefid="response_onenotcorrect" feedbacktype="Response"/>
</respcondition>
</resprocessing>
<itemfeedback ident="0" view="All">
<flow_mat>
<material>
<mattext texttype="text/xhtml"><p></p> <div id="OKAYFREEDOM_INJECTED" style="display: none;"></div></mattext>
</material>
</flow_mat>
</itemfeedback>
<itemfeedback ident="1" view="All">
<flow_mat>
<material>
<mattext texttype="text/xhtml"><p></p> <div id="OKAYFREEDOM_INJECTED" style="display: none;"></div></mattext>
</material>
</flow_mat>
</itemfeedback>
<itemfeedback ident="2" view="All">
<flow_mat>
<material>
<mattext texttype="text/xhtml"><p></p> <div id="OKAYFREEDOM_INJECTED" style="display: none;"></div></mattext>
</material>
</flow_mat>
</itemfeedback>
<itemfeedback ident="response_allcorrect" view="All">
<flow_mat>
<material>
<mattext texttype="text/xhtml"><p></p> <div id="OKAYFREEDOM_INJECTED" style="display: none;"></div></mattext>
</material>
</flow_mat>
</itemfeedback>
<itemfeedback ident="response_onenotcorrect" view="All">
<flow_mat>
<material>
<mattext texttype="text/xhtml"><p>respnotcorrect</p> <div id="OKAYFREEDOM_INJECTED" style="display: none;"></div></mattext>
</material>
</flow_mat>
</itemfeedback>
</item>
</questestinterop>```
I need to parse this whole file and need only the parts I mentioned before. All other content is not needed for this.