C#我如何使用linq和显式接口属性?

时间:2015-06-18 19:31:59

标签: c# linq inheritance interface explicit

我有一个带有两个继承接口的类,你的属性是explicits,因为它们都有一些equals属性,所以,我需要使用LINQ和这个类,但是当我使用&#34时我无法访问explicits属性;选择新的Foo" ......看看案例:

public class QuestaoMontaProva : IQuestao, IExercicio
{

    public int Discordo { get; set; }
    public int Rever { get; set; }
    public int Anotacao { get; set; }
    public int Realizada { set; get; }
    public int Ativo { set; get; }


    int IQuestao.Id { get; set; }

    string IQuestao.EnunciadoQuestao { get; set; }

    string IQuestao.ExercicioTipo { get; set; }

...

和我的LINQ:

var flags = (from b in dt.AsEnumerable()

                             select new QuestaoMontaProva
                             {
                                 IdQuestao = Convert.ToInt32(b["ID_QUESTAO"]), // i can't access this
                                 IdTipoExercicio = Convert.ToInt32(b["ID_TIPOEXERCICIO"]),// i can't access this
                                 Discordo = Convert.ToInt32(b["DISCORDO"]),
                                 Rever = Convert.ToInt32(b["REVER"]),
                                 Anotacao = Convert.ToInt32(b["ANOTACAO"]),
                                 Realizada = Convert.ToInt32(b["REALIZADA"]),
                                 Correta = Convert.ToInt32(b["CORRETA"]),
                                 Ativo = Convert.ToInt32(b["ATIVO"])
                             }).ToList();

3 个答案:

答案 0 :(得分:0)

如果可能,请隐式实现接口,而不是显式实现,Servy suggested

如果这对您不起作用,请使用此部分的方法语法而不是查询语法,以便您可以包含多行委托而不是单表达式。这使您可以强制转换以访问隐藏的属性。

var flags = dt.AsEnumerable().Select(b =>
{
    var q = new QuestaoMontaProva
    {
        Discordo = Convert.ToInt32(b["DISCORDO"]),
        Rever = Convert.ToInt32(b["REVER"]),
        Anotacao = Convert.ToInt32(b["ANOTACAO"]),
        Realizada = Convert.ToInt32(b["REALIZADA"]),
        Correta = Convert.ToInt32(b["CORRETA"]),
        Ativo = Convert.ToInt32(b["ATIVO"])
    };
    var iq = (IQuestao)q;
    iq.Id = Convert.ToInt32(b["ID_QUESTAO"]);
    iq.ExercicioTipo = Convert.ToInt32(b["ID_TIPOEXERCICIO"]);
    return q;
}).ToList();

答案 1 :(得分:0)

您可以为显式接口实现添加支持字段。这样您就可以实现一个接口,并且能够获取/设置值。

var query = from i in items
            select new QuestaoMontaProva
            {
                Id = 1,
                IQuestaoId = 2,
                IExercicioId = 2
            };

public interface IQuestao
{
    int Id { get; set; }
}

public interface IExercicio
{
    int Id { get; set; }
}

public class QuestaoMontaProva : IQuestao, IExercicio
{
    public int Id { get; set; }
    public int IQuestaoId { get; set; }
    public int IQuestao.Id
    {
        get
        {
            return IQuestaoId;
        }
        set
        {
            IQuestaoId = value;
        }
    }

    public int IExercicioId { get; set; }
    public int IExercicio.Id
    {
        get
        {
            return IExercicioId;
        }
        set
        {
            IExercicioId = value;
        }
    }
}

答案 2 :(得分:0)

我找到了一种方法,我只是创建一个代理来使用我班级中接口的属性,看看:

公共课QuestaoMontaProva:IQuestao,IExercicio     {

    public int Discordo { get; set; }
    public int Rever { get; set; }
    public int Anotacao { get; set; }
    public int Realizada { set; get; }
    public int Ativo { set; get; }
    public int IdEspecialidade { get; set; }
    public string NomeEspecialidade { set; get; }
    public string DescricaoAlternativa { set; get; }
    public int IdQuestao { get { return (this as IQuestao).Id; } set { (this as IQuestao).Id = value; } }
    public int IdTipoExercicio { get { return (this as IQuestao).IdTipoExercicio; } set { (this as IQuestao).IdTipoExercicio = value; } }
    public int Correta { get { return (this as IQuestao).Correta; } set { (this as IQuestao).Correta = value; } }
    public int Ano { get { return (this as IExercicio).Ano; } set { (this as IExercicio).Ano = value; } }
    public int IdExercicio { get { return (this as IExercicio).Id; } set { (this as IExercicio).Id = value; } }
    public string NomeExercicio { get { return (this as IExercicio).Nome; } set { (this as IExercicio).Nome = value; } }
    public string Regiao { get { return (this as IExercicio).txtRegiao; } set { (this as IExercicio).txtRegiao = value; } }
    public string EnunciadoQuestao { get { return (this as IQuestao).EnunciadoQuestao; } set { (this as IQuestao).EnunciadoQuestao = value; } }
    public string GuidQuestao { get { return (this as IQuestao).GuidQuestao; } set { (this as IQuestao).GuidQuestao = value; } }


    public int IQuestao.Id { get; set; }

    string IQuestao.EnunciadoQuestao { get; set; }

    string IQuestao.ExercicioTipo { get; set; }

    List<Especialidade> IQuestao.Especialidades { get; set; }

... }

这解决了我的问题! 我希望它能帮到所有人......