C# 我如何使用具有显式接口属性的 linq

本文关键字:接口 属性 linq 何使用 | 更新日期: 2023-09-27 17:57:04

我有一个带有两个继承接口的类,你的属性是显式的,因为两者都有一些相等的属性,所以,我需要在此类中使用 LINQ,但是当我使用"选择新 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();

C# 我如何使用具有显式接口属性的 linq

如果可能的话,隐式实现接口,而不是像 Servy 建议的那样显式实现接口。

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

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();

您可以为显式接口实现添加一个支持字段。通过这种方式,您正在实现一个接口并能够获取/设置值。

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;
        }
    }
}

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

公共类 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; }

。}

这解决了我的问题!!我希望它对大家有所帮助...