Warning: Parameter 1 to wp_default_styles() expected to be a reference, value given in /var/www/jacobkorsgaard.com/public_html/wp/wp-includes/plugin.php on line 571

Warning: Parameter 1 to wp_default_scripts() expected to be a reference, value given in /var/www/jacobkorsgaard.com/public_html/wp/wp-includes/plugin.php on line 571
Jacob Korsgaard » Explicit Interface Member Implementation
Home > Programming > Explicit Interface Member Implementation

Explicit Interface Member Implementation

November 28th, 2009 Leave a comment Go to comments

Jeg opdagede noget meget sært som jeg ikke tidligere har lagt mærke til er muligt i C#. Man kan lave det de kalder en Explicit Interface Implementation.

Mit problem var at jeg ville have linje nummeret og kollonen på et XElement for at give fejl beskeder. Der er dog ikke nogen måde at gøre dette via XElement. Det er der så alligevel! Selvom elementet ikke har en property for LineNumber, så har den alligevel!

Hvis man loader et XDocument med LoadOptions.SetLineInfo så er det muligt at caste et XElement til IXmlLineInfo og få informationen derfra! Det er selvom XElement ikke har metoderne. Det viser sig at XObject implementerer interfacet IXmlLineInfo og det er gjort explicit. Explicit interface member implementations er beskrevet her, og de har et godt eksempel med en filhåndterings klasse, som de gerne vil have er IDisposable men kun exposer en Close metode, så Dispose metoden blot kalder close.

Det gør man bare sådan:

interface IDisposable
{
   void Dispose();
}
class MyFile: IDisposable
{
   void IDisposable.Dispose() {
      Close();
   }
   public void Close() {
      // Do what's necessary to close the file
      System.GC.SuppressFinalize(this);
   }
}

Man kan kalde MyFile.Close() eller man kan caste en MyFile instans til en IDisposable og kalde Dispose(). Kan godt være dette er almen viden, men jeg har ikke set det før :)

  1. No comments yet.
  1. No trackbacks yet.